索引分配映射 (IAM) 如何存储数据/执行索引分配顺序扫描?

var*_*ble -1 index sql-server

索引在SQL Server中被存储为B树。因此,索引扫描(B 树扫描)是从根节点遍历到叶节点的过程。

当引擎被要求以未提交读模式运行查询时,它不会使用 B 树扫描。相反,它执行索引分配顺序扫描。

据我了解,索引分配映射 (IAM) 包含索引以及具有该索引数据的页面的映射。我不确定它是否按索引排序。索引分配映射 (IAM) 如何存储数据/执行索引分配扫描?

Pau*_*ite 6

索引在SQL Server中被存储为B树。因此,索引扫描(B 树扫描)是从根节点遍历到叶节点的过程。

从根到叶级别下降是一个查找操作。扫描使用叶级别的下一页指针(或向后扫描的上一页指针)来遍历叶级别的页。SQL Server 索引中的页面在索引的每个级别都有下一页和上一页指针。

当引擎被要求以未提交读模式运行查询时,它不会使用 B 树扫描。相反,它执行索引分配顺序扫描。

不,存储引擎在读未提交隔离下运行时可以选择使用分配顺序扫描,并且数据访问运算符具有 Ordered :False属性。它可能会也可能不会在运行时使用分配顺序扫描。

据我了解,索引分配映射 (IAM) 包含索引以及具有该索引数据的页面的映射。

IAM 不“包含索引”。它是属于特定对象(堆或索引分区;行内、行溢出或 lob)的范围的位图。每个 IAM 页涵盖特定分配单元的单个数据库文件的 4GB 范围。

有关完整说明,请参阅文档中的管理对象使用的空间。有太多细节,无法在此重复。

我不确定它是否按索引排序。索引分配映射 (IAM) 如何存储数据/执行索引分配扫描?

请务必阅读文档,但每个 IAM 链都包含 IAM 页面,如果相应的 64KB 范围具有当前实体的数据,则在其中设置一个位。由于每个 IAM 页覆盖单个文件的 4GB 范围,因此“顺序”是文件顺序,至少在逻辑上是这样。

SQL Server 从第一个 IAM 页开始执行分配顺序扫描,按文件顺序处理分配给当前实体的范围,然后根据需要跟踪 IAM 链以获取其他 IAM 页。

“文件顺序”性质是“分配顺序”名称的由来。