Sql-Server
非聚集列的聚集索引更新
使用: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
葉級別,但您不按此排序。這些頁面按鍵按物理順序排列。除非您向我們展示您正在執行的表和查詢,否則我無法建議優化查詢,但基本上這筆費用將以一種或另一種方式支付。如果您不更新聚集索引,它將是表更新和表掃描。