Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 什么是堆表(作为DB存储格式)?_Sql Server - Fatal编程技术网

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

Sql server 什么是堆表(作为DB存储格式)?,sql-server,Sql Server,什么是堆表(作为DB存储格式) 根据heap是一种特殊的数据结构,其属性我无法直接映射到DB性能优势 我发现了很多关于堆与集群的讨论,并理解这是集群的(有很多图像和定义),但堆表根本没有定义…引用MSDN链接: 堆是没有聚集索引的表 可以在存储为堆的表上创建一个或多个非聚集索引。数据存储在堆中而不指定顺序。通常数据最初是按行插入表的顺序存储的,但数据库引擎可以在堆中移动数据以高效地存储行;因此,数据顺序无法预测 最关键的一点是,磁盘上的数据存储顺序变得不可更改 堆表中的确定性,因为您没有定义任何

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

根据heap是一种特殊的数据结构,其属性我无法直接映射到DB性能优势

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

引用MSDN链接:


堆是没有聚集索引的表

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

最关键的一点是,磁盘上的数据存储顺序变得不可更改 堆表中的确定性,因为您没有定义任何集群 上面有索引


一旦您在一个表上定义了一个聚集索引,该表有一个列,比如说Id(int类型),您就可以保证在数据库页面文件中,Id为1的行将位于Id为2的行之前。可以找到与SQL Server中的堆表相关的更多有用信息。

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

堆上的表扫描遵循IAM页面中写入的分配顺序;集群表遵循双链接有序的页面列表(主要是为了避免一些一致性问题,因此,如果表上的X锁或读取未提交有效,您也可以使用集群获得分配顺序扫描)

在NCI seek+查找方案中,堆可以比集群表更快。堆上NCIs的叶级包含指向数据的物理指针,而不是有聚集索引值的集群,在大多数情况下,需要从CI上的非叶级进行多次读取,以导航b树结构并查找数据

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


根据经验,在SQL Server中,除非您有很好的理由不使用集群表,否则请使用集群表

堆是没有聚集索引的表@user1429080堆表是否与堆数据结构无关?@user1429080:术语“堆表”和“聚集索引”(尤其是一起)是特定于SQL Server的,而不是通用的“数据库术语”@a_horse_和_no_名称,因此它是非聚集表的供应商(MS)营销术语?