索引在SQL Server中被存储为B树。因此,索引扫描(B 树扫描)是从根节点遍历到叶节点的过程。
当引擎被要求以未提交读模式运行查询时,它不会使用 B 树扫描。相反,它执行索引分配顺序扫描。
据我了解,索引分配映射 (IAM) 包含索引以及具有该索引数据的页面的映射。我不确定它是否按索引排序。索引分配映射 (IAM) 如何存储数据/执行索引分配扫描?
索引在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 页。
“文件顺序”性质是“分配顺序”名称的由来。