什么是堆表(作为DB存储格式)



什么是堆表(作为DB存储格式)?

根据http://en.wikipedia.org/wiki/Heap_%28data_structure%29堆是特殊的数据结构的属性,我不能直接映射到数据库的性能优势…

我发现了很多堆与集群的讨论,并理解集群(有很多图像和定义),但表根本没有定义…

引用MSDN链接:

堆是一个没有聚集索引的表。

可以在作为堆存储的表上创建一个或多个非聚集索引。数据存储在堆中而不指定顺序。通常数据最初是按照插入表的顺序存储的,但是数据库引擎可以在堆中移动数据以有效地存储行;因此不能预测数据顺序

最关键的部分是数据在磁盘上的存储顺序变为非顺序在堆表中不确定,因为您没有定义任何集群索引。

一旦在一个列Id (int类型)的表上定义了集群索引,就可以保证在数据库页面文件中Id为1的行会出现在Id为2的行之前。有关SQL Server堆表的更多有用信息可以在这里和这里找到。

简而言之,堆是SQL Server中没有聚集索引的表。但. .

表扫描堆遵循分配顺序,写在IAM页;集群表遵循双链接有序的页面列表(主要是为了避免一些一致性问题,所以如果表上的X锁或READ UNCOMMITTED生效,您也可以使用集群获得分配顺序扫描)。

在NCI查找+查找场景中,堆可以比集群表更快。堆上nci的叶级包含指向数据的物理指针,而集群中则有一个聚类索引值,在大多数情况下,这需要从CI的非叶级读取几次才能导航b-树结构并找到数据。

如果堆中有变长列,增加列长度的更新可能会导致整行移动到其他页,留下一个转发指针(这是为了避免用指向数据的新指针更新所有nci)。这可能对性能非常不利,唯一的解决方法是重建表。

根据经验,在SQL Server中使用集群表,除非你有很好的理由不这样做。

最新更新