非聚集列上的聚集索引更新

Nic*_*aro 3 sql-server clustered-index execution-plan sql-server-2008-r2

使用:SQL Server 2008 R2

我目前正在逐步执行查询执行计划,并且遇到了表上聚集索引更新的实例。这里的问题是正在更新的列不是聚集索引的一部分。

桌子:

<table>
    id INT IDENTITY(1,1) -- Clustered Index
    , name VARCHAR(20) -- Nonclustered Index
    , status CHAR(1)
    , quantity INT 
    , price FLOAT
Run Code Online (Sandbox Code Playgroud)

更新声明:

UPDATE a
SET a.status = @status
    , a.quantity = @quantity
    , a.price = @price
FROM <table> a
WHERE a.name = @name
Run Code Online (Sandbox Code Playgroud)

执行计划显示 Eager Spool 成本为 36%,聚集索引更新成本为 55%,名称索引上的索引查找成本为 9%,计算标量和顶级项目成本为 0%。

为什么计划显示聚集索引更新?我能做些什么来防止这种情况,并防止急切的线轴?

JNK*_*JNK 8

当表上有聚集索引时,聚集索引就是表!

在这种情况下,您可以在精神上将“表”替换为“聚集索引”,这很有意义。

每行中每个字段的数据都聚集索引中。聚集索引只是将数据库中物理页面的顺序设置为由聚集键组织。

对于这些事情,您也可以始终使用电话簿类比:在您的经典电话簿中,数据聚集在 上Last Name, First Name。每个条目仍然PhoneNum, Address处于叶级别,但您不会按此排序。页面按键按物理顺序排列。

除非您向我们展示您正在运行的表和查询,否则我无法建议优化查询,但基本上这笔费用将以一种或另一种方式支付。如果不更新聚集索引,它将是表更新和表扫描。