索引深入浅出(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/

posted @   Woodytu  阅读(6714)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示