Sql server MS Access更新查询非常慢

Sql server MS Access更新查询非常慢,sql-server,ms-access,odbc,Sql Server,Ms Access,Odbc,我在Access中有一个非常简单的更新查询,它应该更新底层SQL Server。无论出于何种原因,Access都不会将查询传递给服务器,而是自行处理,即,它会对每一行执行更新查询。因为这张桌子很大,所以它永远不会消失 这是使用编辑器生成的查询 更新dbo_myTable 设置dbo_myTable.myColumn='A' 其中dbo_myTable.myOtherColumn=123; 如果我运行与纯SQL相同的查询,只需几秒钟——正如预期的那样 更新dbo.myTable 设置dbo.myT

我在Access中有一个非常简单的更新查询,它应该更新底层SQL Server。无论出于何种原因,Access都不会将查询传递给服务器,而是自行处理,即,它会对每一行执行更新查询。因为这张桌子很大,所以它永远不会消失

这是使用编辑器生成的查询

更新dbo_myTable 设置dbo_myTable.myColumn='A' 其中dbo_myTable.myOtherColumn=123; 如果我运行与纯SQL相同的查询,只需几秒钟——正如预期的那样

更新dbo.myTable 设置dbo.myTable.myColumn='A' 其中dbo.myTable.myOtherColumn=123; 问题不在于“A”值。如果我将其从“A”更改为Null,则问题仍然存在

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

我使用SQLServer探查器来确认我的猜测,access对每一行进行查询,而不是将整个查询传递给SQLServer

相关的:
不久前我有一个类似的问题:。虽然问题是相同的—Access没有传递整个查询—但解决方案必须有所不同,因为这里实际上没有任何特殊命令。

Access中更新查询的语法与SQL server中的语法明显不同,特别是在连接方面。它们不能交给SQL server

主要区别之一是,在Access中,更新查询默认情况下写入锁定所有包含的表,并且可以写入所有表,而在SQL server中,您有一个单独的“从”部分,并且该查询仅写入锁定和写入单个表


相反,如果性能有问题,请使用直通查询在SQL server上执行更新查询。

也许您可以愚弄Access调用批量更新:

Sql=UPDATE dbo.myTable SET dbo.myTable.myColumn='A',其中dbo.myTable.myOtherColumn=123; CurrentDb.executesql,dbQSPTBulk 上面的dbqsqlptbulk应该与dbqsqlpassthrough一起使用 但你不必这么做

如果使用上述命令,则只发送一个更新命令


信用:Albert Kallal

myOtherColumn的数据类型是什么?可能您错过了myOtherColumn的索引?myOtherColumn包含整数值。它也有一个索引。但是,由于查询在通过时运行得非常快,因此问题必须在Access中的某个位置出现。如果myOtherColumn=123导致约100.000行,则访问需要几分钟,而传递查询在约3秒钟内完成。MS SQL server有足够的RAM来容纳RAM中的整个表-实际上足够容纳RAM中大约1/4的DB。但是这里只有一个表,没有连接。这与此无关。SQL server和Access之间的更新查询语法不同。Afaik Access不会尝试将查询直接转换或传递给SQL server,即使这个查询非常简单,可以实现这一点。不过,我很少执行如此简单的更新查询。它可以用一种非常简单的方式进行修改,就像大多数Access更新查询一样:它被转换为SELECT查询,然后在SQL server上分别更新每一行。而这正是OP在他的问题中所说的。当然,这在大型数据集上是非常次优的。不过,如果您有其他解释,请随意发布您自己的答案。不确定语法差异是否是主要原因,但Access从不将UDPATE查询传递给服务器,而是自行处理。它还希望显示您将要更新xyz记录的消息框,Yes/No?,否则将无法更新。-解决方案如Erik所写:使用传递查询更新更大的数据集。@Andre:每一行在SQL server上分别更新。我已经和比我更有知识的人核实了这一点,埃里克是对的。我不知道。