使用 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 服务器上创建一个视图。
我一直致力于将 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 服务器上创建一个视图。