2015-07-01 26 views
0

我不明白爲什麼它不是那麼簡單爲什麼可以在SQL Server 2012不是包含列添加到現有的非聚集索引

alter index whatever add included (columnName) 

什麼會阻止這是一個簡單的操作到SQL Server那會將列添加到索引並填充表中頁面中的值?

這不會影響所有索引的排序,只是試圖優化select語句。我希望我的停機時間可以比現在需要的8小時減少並重建一系列指數,但令人遺憾的是我感到失望。

+0

你就不能使用'(在線= ON)'指定?大多數索引可以更改並保持在線狀態。 –

+1

由於頁面拆分的數量很可能隨後將此列添加到所有頁面上的每一行,無論如何,從零開始重新創建索引的速度會更快。您可以使用'drop_existing'來避免再次對數據進行排序。 –

+0

實際上,仍然需要排序,不管因爲當前索引不包括該列,它不會100%查找回基表以獲取它。 –

回答

3

因爲包括列是索引頁,所以此刻的你碰到這樣的:

頁 行1:鍵1,鍵2,公司1排2:鍵1,鍵2,公司1,第3行:鍵1,鍵2,公司1 ...

如果第1點開始在字節0,第2行是在字節x等

要添加一個新的包含列你需要取每個頁面,將其分割成行添加列,然後重新編寫它,可能在1頁或1頁以上,包括指向它的前一頁的元數據 - 有效你不得不完全重寫索引,爲什麼不重建它呢?

對於SQL Server來說,構建一個新的索引比在這裏和那裏插入少量數據要便宜。

編輯:另外,你顯然會得到索引碎片,所以你就需要再重建它

+0

這是有道理的。我沒有深入研究索引究竟是什麼。 –

相關問題