索引可以优化 UPDATE 语句吗?

Posted

技术标签:

【中文标题】索引可以优化 UPDATE 语句吗?【英文标题】:Can indexing optimize UPDATE statements? 【发布时间】:2021-07-05 14:36:02 【问题描述】:

我目前正在尝试优化 UPDATE 语句,该语句每天执行一次以更新超过 1000 万行的列,并且需要数小时。很简单:

UPDATE table SET column = ''

此表只有 2-3 个索引,不包括提到的列。

由于大多数行已经更新,仅针对提到的列的索引是否可以使 sql server 更快地查找列以获得更快的更新?谢谢!

【问题讨论】:

我想,最好提供完整的查询,因为 UPDATE table SET column = '' 不是为了优化。无论如何,如果没有谓词,您将获得 Table Scan 您在此处更新每一行;在列上添加索引更有可能使过程变慢,而不是更快。 你肯定不需要更新已经是''的列,所以大概你还没有分享完整的声明? @Stu 每天都会更新新行 为什么不只更新您实际需要的行?即添加 where 子句WHERE Column <> '' OR Column IS NULL?这应该可以防止大量不必要的开销 【参考方案1】:

既然您说“大多数行已经更新”,您可能应该添加一个WHERE 条件,以便只更新真正需要的行(正如其他人已经说过的那样)。如果没有WHERE 子句,将更新所有 记录,即使是那些已经具有相同值'' 的记录。

因此,即使 90% 的记录需要更新,如果避免冗余更新,速度仍然会快一些。但在这种情况下,在该列上建立索引只会减慢查询速度,因为在更新基础表记录时必须更新每个索引。

为了从索引中受益,您需要一个具有低选择性的查询,就像SELECT-queries 一样。什么可以被认为“足够低”取决于许多因素。有时索引可以帮助实现 10-20% 的选择性。其他时候,与流行的看法相反,即使是 1% 的选择性也会使事情变得更糟。

【讨论】:

以上是关于索引可以优化 UPDATE 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章

sql语句怎么看效率?

sql语句优化方案

MySQL 原理与优化:Update 优化

MySQL优化 优化关键技术

MySQL的更新语句update中可以用子查询吗?

python3.4中 import pymssql 后,当UPDATE语句执行完成,如何返回执行行数,请给出详细代码