我有一个前端应用程序,它允许其他人根据选择的选项创建详细的 SQL 查询。然后,此 SQL 代码用作传递查询,并显示为表单的一部分。
但是,创建的直通查询异常缓慢。在 Access 中运行时,它们的范围从 3 分钟到 20 分钟不等。SQL Server Management Studio 2012 设法在 45 秒到 3 分钟内完成相同的查询。如何最小化或消除这个时间差?
tldr:
在 SSMS 中运行查询的时间:45 秒
在 Access 中运行查询的时间:3 分钟
打开包含查询的访问表单的时间:3 分钟
问题背后的结构
查询的结构如下
SELECT ...
FROM
(
SELECT ...
FROM
(
SELECT ... FROM Archive.YearXX
UNION
SELECT ... FROM Archive.YearXX
UNION
SELECT ... FROM Current.Year16
)
LEFT JOIN ReferenceData.Table ON...
)
WHERE ...
GROUP BY ...
ORDER BY ...
其中各种选项几乎可以更改代码中的任何内容,从UNION
段中拉出哪些表,在语句中返回哪些字段SELECT
,包含在WHERE
、GROUP BY
和ORDER BY
子句中的内容。
所有 SQL Server 都位于同一本地位置,并且引用的表范围从 20 个字段乘以 100,000 行到 30 个字段乘以 13,000,000 行
当前连接字符串(实际数据已编辑):
ODBC;Driver=SQL Server;Server=[server name];DATABASE=[database];UID=[username];PWD=[password];
创建 QueryDef 的 VBA 代码:
Set qdf = CurrentDb.CreateQueryDef("GeneratedReportData", GenSQL(False))
qdf.Connect = "ODBC;Driver=SQL Server;Server=[server name];DATABASE=[database];UID=[username];PWD=[password];"
qdf.ReturnsRecords = True
qdf.ODBCTimeout = 0
约束
我无法更改我正在使用的语言或软件。
关于子查询的结构和使用几乎没有什么可以做的。