tl;博士
我正在使用MS access通过ODBC从MS SQL Server DB查询数据。我使用access编辑器构建了一个查询,这花了很多时间。运行时,CPU,RAM和I / O值极低。如果单击“通过”按钮并将查询重写为SQL,则只需几分钟。在运行MS SQL服务器时,会占用大量CPU,RAM和I / O(根据需要和期望)。我的结论是,access不会为MSSQL服务器提供完整的查询,但可能由itselt提供。 如何强制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_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.AP.IDAPB
HAVING (((dbo.AP.IDAPB) Like 1));
此查询运行非常快。 MSSQL使用约90%的CPU,并且I / O大约是底层SSD的最大值。
问题是,对于传递查询,我需要将值输入查询本身,并且不再使用对话框。我该怎么办?如何强制access从用户(使用对话框)获取值,构建查询并将所有内容发送到MSSQL进行处理?