在上一個文章裡,我們了解了有聚集索引表和沒有聚集索引表之間的差別。有聚集索引的表叫聚集表。沒有聚集索引的表叫堆表(heap table)。
堆表(heap table)
- 沒有聚集索引的表
- 堆表在sys.partitions裡有1條index_id = 0 的記錄
- 資料存儲沒有任何的順序,插入資料也沒順序
- 由于資料沒有任何順序,查詢資料會非常慢
- 資料頁之間沒有互相連結
- 從資料頁讀取資料,需要從IAM(Index Allocation Map)頁裡找頁号
- 在sys.system_internals_allocation_units系統視圖裡,first_iam_page列,指向IAM頁鍊中的第一個IAM頁,它用來管理堆表的空間配置設定
- 因為沒有聚集索引,碎片不能通過重建索引(rebuilding the index)處理
- SQL Server使用IAM頁在堆結構裡導航。配置設定給堆的頁沒有任何的順序,且不互相連結。資料頁之間唯一的邏輯關聯是存在IAM頁裡的資訊。
每個IAM頁存儲單個對象的配置設定(單個頁或區配置設定)資訊。堆表的表掃描是通過掃描IAM頁,找到儲存堆表資料的對應頁或區來完成。
使用下列指令可以獲得IAM頁。
1 DBCC IND('databasename','Tablename',-1)
上述查詢的輸出結果裡,Page Type列值為10的記錄就是IAM頁。
堆的結構如下圖所示:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwEzM5QTN5cTN1UTNxITMvwVNwUTMwIzLchDNzATN38CX1EDMyc2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
參考文章:
http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/06/sql-server-index-part-2-structure-of-heap-tables/
注:此文章為
WoodyTu學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!
若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!