2009-05-22 30 views
25

我執行以下語句:爲什麼我會導致羣集索引更新?

UPDATE TOP(1) dbo.userAccountInfo 
SET   Flags = Flags | @AddValue 
WHERE   ID = @ID; 

列 'ID' 是一個INT PRIMARY KEY與IDENTITY約束。 標誌是一個BIGINT不爲NULL。

執行路徑指示聚集索引更新正在發生。一個非常昂貴的操作。 除主鍵外,沒有包含標誌或ID的索引。 我覺得實際的執行路徑應該是:

聚集索引查找=>更新

+0

你一定確定該索引既不聚集也不覆蓋該領域[標誌]? – 2009-05-22 00:06:53

+0

查詢中的TOP(1)是什麼? – BradC 2009-05-22 00:10:37

+0

@未知Google: 此表上只有一個非聚集idx。它既不影響ID也不影響標誌。 @ BradC: 在我的發言中有點冗長。 「這個陳述只會影響一個用戶。」但真的沒有任何目的。 – Kivin 2009-05-22 00:15:06

回答

27

表有兩種形式:聚集索引和堆。你有一個PRIMARY KEY約束,所以你已經隱含地創建了一個聚集索引。在製作這張而不是時,您必須增加額外的長度。 '表'的任何更新都是聚簇索引的更新,因爲聚簇索引表。 至於聚集索引更新是一個'非常昂貴的操作',現在這是一個城市傳說,圍繞着關於數據庫如何工作的基本錯誤信息。正確的語句是'影響聚簇鍵的聚集索引更新必須更新所有非聚簇索引'。

10

聚集索引物理表,所以每當你更新任何行,您要更新集羣指數。

this MSDN article

相關問題