【发布时间】:2019-11-14 21:26:37
【问题描述】:
tl;dr
我正在使用 MS Access 通过 ODBC 从 MS SQL Server DB 查询数据。我使用 Access 编辑器构建了一个查询,它需要很长时间。运行时,CPU、RAM 和 I/O 值极低。如果我单击 Pass-Through 按钮并将查询重写为 SQL,则只需几分钟。在运行 MS SQL 服务器时,会使用大量 CPU、RAM 和 I/O(如所期望的那样)。我的结论是,Access 不会为 MSSQL 服务器提供完整的查询,但可能会自行完成部分。 如何强制 Access 发送完整的查询并让 MSSQL 完成繁重的工作?
加长版
我使用 MS Access 作为前端,通过 ODBC 连接到大型(~100 GB)MS SQL Server DB。我有几个查询真的很慢。我为这个问题选择了一个特定的问题,因为我认为问题在于 Access 和 MSSQL 之间的通信。
Access-specifi-SQL 中的查询如下所示:
SELECT DISTINCTROW dbo_A.IDA, dbo_A.MNr, Max(dbo_APK.G) AS MaxG, dbo_AP.IDAPB
FROM ((dbo_A LEFT JOIN dbo_AP ON dbo_A.IDA = dbo_AP.IDA) LEFT JOIN dbo_APK ON dbo_A.IDA = dbo_APK.IDA) INNER JOIN dbo_L ON dbo_A.IDL = dbo_L.IDL
WHERE (((dbo_L.M) Like [LC Dialog]) AND ((dbo_AP.G)<=[<= G Dialog]))
GROUP BY dbo_A.IDA, dbo_A.MNr, dbo_AP.IDAPB
HAVING (((dbo_AP.IDAPB) Like [IDAPB Dialog]));
如您所见,没有什么太花哨的:三个对话框询问用户用于 WHERE 和 HAVING 子句作为过滤器的值。其余的只是基本命令:SELECT、LEFT/RIGHT/INNER JOIN、WHERE、GROUP BY、HAVING
在运行时,Access 使用 ~ 100MB RAM 和 5% CPU。 MSSQL 的 CPU 占用率约为 10%。两者都几乎没有 I/O。查询需要很长时间。
将其转换为真正的 SQL 归结为将表名中的下划线替换为句点,将参数对话框替换为值并将 DISTINCTROW 更改为 DISTINCT。全部完成。
SELECT DISTINCT dbo.A.IDA, dbo.A.MNr, Max(dbo.APK.G) AS MaxG, dbo.AP.IDAPB
FROM ((dbo.A LEFT JOIN dbo.AP ON dbo.A.IDA = dbo.AP.IDA) LEFT JOIN dbo.APK ON dbo.A.IDA = dbo.APK.IDA) INNER JOIN dbo.L ON dbo.A.IDL = dbo.L.IDL
WHERE (((dbo.L.M) Like 'abc') AND ((dbo.AP.G)<='01.01.2020'))
GROUP BY dbo.A.IDA, dbo.A.MNr, dbo.AP.IDAPB
HAVING (((dbo.AP.IDAPB) Like 1));
这个查询运行得非常快。 MSSQL 使用约 90% 的 CPU,I/O 大致处于底层 SSD 的最大值。
问题是,对于直通查询,我需要将值输入到查询本身并且不能再使用对话框。我能做些什么呢?如何强制 Access 从用户(通过对话框)获取值、构建查询并将所有内容发送到 MSSQL 进行处理?
【问题讨论】:
标签: sql-server ms-access odbc