MS Access UPDATE查询非常慢

时间:2019-12-06 09:29:09

标签: sql-server ms-access odbc

我在Access中有一个非常简单的UPDATE查询,该查询应该更新基础SQL Server。无论出于何种原因,Access都不会将查询传递给服务器,而是由它自己处理,即,它对每一行进行更新查询。由于表很大,因此它将永远运行。

这是由编辑器生成的查询。

UPDATE dbo_myTable
SET dbo_myTable.myColumn = 'A'
WHERE dbo_myTable.myOtherColumn = 123;

如果我运行与纯SQL相同的查询,则只需要几秒钟-如预期的那样。

UPDATE dbo.myTable
SET dbo.myTable.myColumn = 'A'
WHERE dbo.myTable.myOtherColumn = 123;

问题不是'A'值。如果我将其从'A'更改为Null,问题仍然存在。

背景:

我的实际更新查询更加复杂,涉及联接和多个条件。在调试速度问题时,我可以将其分解为上面已经很慢的上述简单查询。

我使用SQL Server Profiler来确认我的猜测,即访问将对每一行进行查询,而不是将整个查询传递给SQL Server。

相关:

不久前,我有一个类似的问题:Force MS Access to send full query to SQL server。尽管问题是相同的-访问没有传递整个查询-解决方案必须有所不同,因为这里实际上没有任何特殊命令。

2 个答案:

答案 0 :(得分:3)

Access中更新查询的语法与SQL Server的语法有很大不同,尤其是在连接方面。它们无法移交给SQL Server。

主要区别之一在于,在Access中,更新查询写操作默认情况下锁定所有包含的表并可以写入所有表,而在SQL Server中,您有一个单独的FROM部分,并且查询只写锁并写入单个表。

如果性能存在问题,请使用直通查询在SQL Server上执行更新查询。

答案 1 :(得分:1)

也许您可以欺骗Access来调用批量更新

Sql = "UPDATE dbo.myTable SET dbo.myTable.myColumn = 'A' WHERE dbo.myTable.myOtherColumn = 123;"
CurrentDb.Execute Sql, dbQSPTBulk
  

上面的dbqQSPTBulk应该与dbQSQLPassthough一起使用   但不必。

     

如果在上面使用,则仅发送一个更新命令。

信用:阿尔伯特·卡洛尔