Sql-Server
在表(堆)上沒有聚集索引的好處
在 SQL Server 中的表上沒有聚集索引有什麼好處?
將要:
SELECT * INTO TABLE_A FROM TABLE_B
TABLE_A
如果是堆,會更快嗎?如果表是堆,哪些操作將受益?
我很確定
UPDATE
s 和DELETE
s 將從聚集索引中受益。s呢INSERT
?我的理解是,INSERT
“可能”受益於作為堆的表,無論是在速度方面,還是在其他資源和硬體(I/O、CPU、記憶體和儲存……)方面。就硬體而言,最稀缺的資源是什麼?在儲存方面,堆會佔用更少的空間嗎?磁碟儲存不是最便宜的資源嗎?如果是這樣,將表保留為堆以節省磁碟空間是否合理?
SELECT
使用、和INSERT
,堆將如何影響 CPU 和 I/O ?當 table 是一個 heap 和 we 時,成本會增加多少?UPDATE``DELETE``SELECT``UPDATE``DELETE
我只是在解決標題中的問題。問題主體有太多不同的問題需要在堆棧交換答案中回答。與具有聚集索引的表相比,堆具有以下優點:
- 具有聚集索引的表按這些索引的順序物理組織數據。如果要插入的數據尚未按聚集鍵順序排序,SQL Server 查詢優化器可能會向查詢計劃添加足夠大的插入排序。排序執行的額外工作不是免費的,因此查詢可能會執行得更慢。插入非分區堆不需要排序的源數據。
- 最小日誌記錄規則在堆和聚集索引之間的工作方式不同。在某些情況下,插入到堆中將寫入事務日誌的字節數少於插入到具有聚集索引的表中的可比較的字節。有關一些範例,請參閱數據載入性能指南。
- 聚集索引可防止並行插入到表中。查詢計劃的插入部分將始終位於串列區域 (DOP = 1)。從 SQL Server 2016 開始,在沒有非聚集索引的堆中插入可以符合併行插入的條件。
- 當許多單獨的程序插入同一個表時,聚集索引將增加鎖和閂鎖爭用。沒有非聚集索引的堆可以由多個程序同時載入,並且爭用較少,尤其是當這些插入來自 SQL Server 之外並具有批量更新鎖時。