强制MS Access将完整查询发送到SQL Server

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进行处理?

a3345887 回答:强制MS Access将完整查询发送到SQL Server

您可以即时修改传递查询。并将您的传递视为一种视图。

例如:

CurrentDb.QueryDefs("YourPassThrough").sql = 
"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 ' "& abcTextString & "') AND ((dbo.AP.G)<='" & YourDate & "'))
GROUP BY dbo.A.IDA,dbo.AP.IDAPB
HAVING (((dbo.AP.IDAPB) Like " & YourNumber & "));

然后您可以:

Select * FROM YourPassThrough;
,

您想阅读这篇文章:
How to optimize Microsoft Access when using ODBC data sources

尤其是从此处开始的部分:

  

确保将查询发送到服务器进行处理。针对远程数据的查询性能中最重要的因素是确保服务器运行尽可能多的查询。 Microsoft Jet数据库引擎尝试将整个查询发送到您的服务器,但是在本地评估服务器或您的特定服务器通常不支持的所有查询子句和表达式。服务器通常不支持的功能包括:

Access和ODBC驱动程序总是尝试将完整的查询传递给服务器,但是有时是不可能的(或者Access认为如此)。

内部联接与多个左联接的结合通常会妨碍我的经验。

您在WHERE和HAVING子句中有dbo_AP,因此它实际上是一个INNER JOIN =>您可以将Join从LEFT更改为INNER。

也请尝试删除DISTINCTROW或将其更改为DISTINCTDISTINCTROW没有等效的SQL Server,请参阅here
通常,它是使用较旧的Access版本构建的查询的遗留物。


但是,如果在不删除所需功能的情况下无法在服务器上处理查询,则必须收集参数,例如在表单上,​​然后按照Manuel的描述构建传递查询。

本文链接:https://www.f2er.com/3099240.html

大家都在问