Sql-Server

截斷和插入:堆並建立索引或直接進入聚群表

  • March 23, 2021

在 ETL 中,最好在插入數百萬行之前刪除索引並在再次創建索引之後立即刪除索引,或者只需將索引插入到空表中。

我知道我可以對其進行測試和測量(還沒有這樣做)但是我要理解原因,那就是更昂貴的:排序並插入到聚集索引中或創建索引。

我保留了索引,當我插入時,我在執行計劃的末尾看到了一個排序。此外,根節點之前的聚集索引插入運算符非常昂貴(基本上所有成本都在排序和聚集索引插入運算符之間分配)。

我使用 TABLOCK 進行插入,恢復模型很簡單,表是行儲存。

我會將聚集索引保持在原位,特別是如果數據被大量插入(而不是大量單獨的插入)。

如果從頭開始重建數據,您應該刪除非聚集索引。

*注意:根據您提到的截斷,這個答案是關於從頭開始重建表。

如果您將數百萬行添加到已經包含數十億行的表中,則考慮因素會有所不同。*

根節點之前的聚集索引插入運算符非常昂貴

這就是將所有數據寫入永久儲存的步驟。你會得到一個同樣昂貴的步驟。

(基本上所有成本都在排序和聚集索引插入運算符之間分配)。

這是意料之中的。如果您關閉索引以便擁有一個堆,那麼當您讀取聚集索引時,它將不得不重新讀取數據,執行相同的排序,並以新的順序重寫頁面 - 所以它會很昂貴,可能更多因此,與打開聚集索引的初始插入相比。

我知道我可以測試它並測量它

這是一個很好的觀點!

不要只測量數據插入:請記住,在已填充的表上創建索引也會很昂貴,因此僅比較“插入堆”和“插入 CI”而不是“插入堆 +”是“不公平的”建構 CI”和“使用 CI 插入”。此外,相關數據文件中將需要更多空間,因為在重建索引時它將有兩個數據副本(堆和新形成的聚集索引,完成後將替換它)。

在其他空的新鮮(因此接近零長度的數據文件)測試數據庫中嘗試兩者,以查看不同的文件增長效果。

但我怎麼理解原因

我建議嘗試一下,同時重建索引,並查看查詢計劃和 IO 統計資訊中顯示的已完成工作。

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