MS Access UPDATE 查询很慢

Posted

技术标签:

【中文标题】MS Access UPDATE 查询很慢【英文标题】:MS Access UPDATE query very slow 【发布时间】:2019-12-06 09:29:09 【问题描述】:

我在 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 来确认我的猜测,即 access 对每一行进行查询,而不是将整个查询传递给 SQL Server。

相关:

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

【问题讨论】:

myOtherColumn的数据类型是什么? 也许您错过了 myOtherColumn 上的索引? myOtherColumn 包含整数值。它也有一个索引。但是由于如果通过查询,查询运行速度非常快,因此问题必须在 Access 中的某个地方。如果 myOtherColumn=123 产生约 100.000 行,Access 需要分钟,而直通查询在约 3 秒内完成。 (MS SQL 服务器有足够的 RAM 来容纳 RAM 中的整个表 - 实际上足以容纳 RAM 中大约 1/4 的 DB)。 【参考方案1】:

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

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

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

【讨论】:

但是这里只有一张表,没有join。 这不相关。 SQL Server 和 Access 的更新查询语法不同。 Afaik Access 不会尝试将查询直接转换或传递给 SQL 服务器,即使这个很简单,它可以做到这一点。但话又说回来,我很少执行这么简单的更新查询。 它可以通过一种非常简单的方式进行修改(就像大多数 Access UPDATE 查询一样):它被转换为 SELECT 查询,然后在 SQL 服务器上单独更新每一行。这正是 OP 在他的问题中所说的。当然,这在大型数据集上非常不理想。不过,如果您有其他解释,请随时发布您自己的答案。 不确定语法差异是否是主要原因,但 Access 从不将 UDPATE 查询传递给服务器,而是自己处理它们。它还希望显示消息框“您即将更新 xyz 记录,是/否?”,否则这是不可能的。 -- 解决方案正如 Erik 所写:使用 Pass-Through 查询 更新更大的数据集。 @Andre:SQL 服务器上的每一行都是单独更新的。 我已经与比我知识渊博的人核实了这一点,Erik 是对的。我不知道。【参考方案2】:

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

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

上面的 dbqQSPTBulk 应该和 dbQSQLPassthough 一起使用 但你不必这样做。

如果你使用上面的,那么只发送一个更新命令。

学分:阿尔伯特·卡拉尔

【讨论】:

以上是关于MS Access UPDATE 查询很慢的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access 中的多个日期范围

MS Access 2007 重命名自定义组中的快捷方式以更改对象的名称

使用模式匹配更新(MS Access)

查询或 dsum 中的 MS Access 性能 dlookup?

此 Access 查询的 MS SQL 等效项是啥?

在 MS Access 中回滚多个 SQL 更新查询