索引可以优化 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 语句吗?的主要内容,如果未能解决你的问题,请参考以下文章