Sql-Server

非聚集列的聚集索引更新

  • February 6, 2012

使用:SQL Server 2008 R2

我目前正在逐步執行查詢執行計劃,並且遇到了一個表上的聚集索引更新實例。這裡的問題是正在更新的列不是聚集索引的一部分。

桌子:

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

更新聲明:

UPDATE a
SET a.status = @status
   , a.quantity = @quantity
   , a.price = @price
FROM <table> a
WHERE a.name = @name

執行計劃顯示成本為 36% 的 Eager Spool、成本為 55% 的聚集索引更新和名稱索引上的 Index Seek 成本為 9%,其中計算標量和 Top 項的成本為 0%。

為什麼計劃顯示聚集索引更新?我能做些什麼來防止這種情況,並防止急切的線軸?

當您在表上有聚集索引時,聚集索引就是表!

在這種情況下,您可以在心理上將“表”替換為“聚集索引”,這將是有意義的。

每行中每個欄位的數據都您的聚集索引中。聚集索引只是設置數據庫中物理頁面的順序,由你的聚集鍵組織。

對於這些事情,您也可以隨時使用電話簿類比:在您的經典電話簿中,數據聚集在Last Name, First Name. 每個條目仍然具有PhoneNum, Address葉級別,但您不按此排序。這些頁面按鍵按物理順序排列。

除非您向我們展示您正在執行的表和查詢,否則我無法建議優化查詢,但基本上這筆費用將以一種或另一種方式支付。如果您不更新聚集索引,它將是表更新和表掃描。

引用自:https://dba.stackexchange.com/questions/12328