索引深入淺出(2/10):堆表


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

堆的結構如下圖所示:

 

參考文章: 

http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/06/sql-server-index-part-2-structure-of-heap-tables/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM