索引深入浅出(2/10):堆表
2015-05-12 15:57
197 查看
在上一个文章里,我们理解了有聚集索引表和没有聚集索引表之间的区别。有聚集索引的表叫聚集表。没有聚集索引的表叫堆表(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页。
上述查询的输出结果里,Page Type列值为10的记录就是IAM页。
堆的结构如下图所示:
堆表(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页。
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/相关文章推荐
- 索引深入浅出(0/10):索引深入浅出的聚集索引页
- 索引深入浅出(8/10):覆盖索引或列包含
- 索引深入浅出(6/10):选择正确并合适的聚集索引键
- 索引深入浅出(3/10):聚集索引的B树结构
- 索引深入浅出(9/10):过滤索引
- 索引深入浅出(1/10):索引简介
- 索引深入浅出(10/10):创建索引时,键列位置的重要性
- 索引深入浅出(7/10):非唯一列上的非聚集索引
- 索引深入浅出(5/10):非聚集索引的B树结构在堆表
- 索引深入浅出(4/10):非聚集索引的B树结构在聚集表
- 深入浅出理解索引结构
- 深入浅出Windows 10 通用应用开发学习笔记(C++) 3-1
- osg入门系列10-以索引方式的几何体绘制
- 深入浅出理解索引结构
- Python相关文章索引(10)
- B*树索引50-50和90-10拆分
- sql优化之:深入浅出理解索引(系列二)(讲解非常透彻)
- 深入浅出理解索引结构
- 10-求最大值、索引、排序总结
- 深入浅出理解索引结构