在上一個文章里,我們理解了有聚集索引表和沒有聚集索引表之間的區別。有聚集索引的表叫聚集表。沒有聚集索引的表叫堆表(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頁。
堆的結構如下圖所示: