繁体   English   中英

是在SQL Server中的聚集索引扫描期间读取实际表数据还是仅读取索引指针?

[英]Is the actual table data read during clustered index scan in SQL server or just the index pointers?

我知道聚簇索引创建了一个B树,实际数据作为双链表存储在叶子的连接中。

但是,当进行索引扫描(从表中选择没有任何“ where”子句的数据)时,SQL Server是仅读取索引指针(非叶节点)还是实际读取数据。

我的执行计划表明,聚集索引扫描获得了1 GB的数据,几乎与我的表大小相同。 根据我的理解,SQL索引扫描应该获取所有实际的Table数据。 我在这里想念什么吗?

聚集索引本身就是表,因此可以读取表。索引指针仅用于在BTree中导航

聚簇索引本身就是实际的表...

如果直接创建没有聚簇索引的表,则该表称为堆-只是一些未组织(无序)的页面集。 每页将指向上一页和下一页(双向链接列表)。

现在,假设您为该表创建了聚集索引:

现在,所有页面都按照为集群指定的键的顺序进行存储->这些页面是叶级页面,并且每一行都包含实际数据。 这些仍然使用双向链表。

此外,聚簇索引结构将在上级(可能不止一个级别)中包含额外的页面,以便它们形成平衡的树->这些是分支页面和根页面。 仅从聚集键派生的数据用作指向较低级别页面的指针。

这种格式使得SQL引擎可以找到轻松查找数据所需的页面(称为SEEK操作),例如,当您执行使用与集群键匹配的谓词的查询时,它将能够有效地定位确切的数据。

如果键不匹配,或者SQL知道该表足够小(甚至知道它返回的几乎是整个表数据),则不必使用上级页面。 它可能决定直接转到叶级页面以扫描所有行并找出匹配的记录。 记住双链表指向上一页和下一页。

奖励:即使您指定WHERE子句,也可能进行索引扫描,因为它不能使用搜索或SQL认为扫描比搜索更有效。

让我知道是否有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM