我知道索引会降低数据修改性能,但我有一个任务,其中(几乎)所有更新都是按顺序对项目完成的。聚集索引会提高还是降低更新这些行的性能?
聚簇索引将位于一列id
所在id
的IDENTITY
列上。id
因此永远不会改变,并且将是连续的(此外,永远不应删除行)。这是我的更新语句的格式:
UPDATE [table] SET value = 1
WHERE id IN (1,2,3,4...)
然而,这些值不一定是连续的。IN (1,2,4,5)
如果未设置为更新,则也可能有一个序列id=3
,但它们将始终按顺序排列。
当所有更新都按顺序进行时,聚簇索引会提高还是降低性能?
像这样的 IN 是一组离散值。SQL Server 不会费心计算它是一个范围或检查升序值。
也就是说,
x IN (1,2,4,5)
被解析为x=1 OR x=2 OR x=4 OR x=5
. OR 在大多数情况下是不可 SARGable 的,并且会导致扫描而不是搜索。如果您将数据放入带有索引的临时表中,
x IN (SELECT foo FROM #bar)
然后它就变成了半连接,并且更有可能使用索引