使用 Access 前端和 SQL 后端的查询速度

Query speeds using Access front with SQL backend

我一直致力于将 Access 数据库转换为 MS SQL。对于我的初始测试,我已使用 SQL Server Express 2014 将后端数据导入我的系统。到目前为止,除了一个查询外,我已经能够使用我的 Access 前端进行所有操作。

在有问题的 table 上设置主键有所帮助,但并不完全。当我在 Access 中 运行 查询时,运行 大约需要 10 秒,但是当我从第二台计算机 运行 查询时,运行 最多需要 30 秒.但是,如果我 运行 直接查询 Server Management Studio,它会在一秒钟内 运行s。

我不确定速度变慢是因为我 运行宁 SQL 离开了我的笔记本电脑,因为它是 SQL Server Express,还是两者的结合。我希望有人可以为我提供更多信息。

这是查询的副本:

SELECT tbl_defects.*,
       tbl_parts.part_type,
       tbl_parts.number,
       tbl_parts.mold,
       tbl_parts.date_created,
       tbl_parts.blade,
       tbl_parts.product,
       tbl_defects.defects_id
FROM   tbl_parts
       RIGHT JOIN (tbl_dispositions
                   RIGHT JOIN tbl_defects
                           ON tbl_dispositions.dispositions_id =
                              tbl_defects.disposition)
               ON tbl_parts.parts_id = tbl_defects.part
ORDER  BY tbl_defects.defects_id DESC; 

在 tbl_Defects 上,主键是 Defects_ID 并设置为索引。在 tbl_disposition 上,主键是 Disposition_ID 并且它被设置为索引。第三个 table tbl_parts 主键是 Parts_ID 并且它也被设置为索引。

如果我将任何右联接切换为内部联接,查询将 运行 正确但会丢失大约 2000 条记录。

您可以使用更约定俗成的 left join 方法尝试 运行 查询吗?

FROM tbl_Defects LEFT JOIN
     tbl_Dispositions
     ON tbl_Dispositions.Dispositions_ID = tbl_Defects.Disposition LEFT JOIN
     tbl_Parts
     ON tbl_Parts.Parts_ID = tbl_Defects.Part

如果需要括号:

FROM (tbl_Defects LEFT JOIN
      tbl_Dispositions
      ON tbl_Dispositions.Dispositions_ID = tbl_Defects.Disposition 
     ) LEFT JOIN
     tbl_Parts
     ON tbl_Parts.Parts_ID = tbl_Defects.Part

也许由于连接,执行计划中出现了一些乱码。 RIGHT JOIN 可能非常棘手,因为 FROM 子句的解析是从左到右进行的。不过,我很确定这会 return 相同的结果集。

根据我的经验,当 Access 中的 linked 表 运行 时,某些具有多个 LEFT(或 RIGHT)JOIN 的查询执行不佳。

我建议为此创建一个传递查询,如果可能的话(如果您不需要编辑结果集)。这将 运行 直接在服务器上,就像在 SSMS 中一样。

或者您可以在 SQL 服务器和 link 服务器上创建一个视图。