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

时间:2017-07-12 16:08:21

标签: sql sql-server sqlperformance

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

但是当存在索引扫描(从表中选择没有任何“where”子句的数据)时,SQL服务器是否只读取索引指针(非叶子节点)或者它是否实际读取数据。

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

2 个答案:

答案 0 :(得分:0)

聚簇索引本身就是表,所以表是read..Index指针只用于导航BTree

答案 1 :(得分:0)

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

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

现在假设您为该表创建聚簇索引:

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

此外,聚集索引结构将涉及较高级别的额外页面(可能超过一个级别),以便它们形成平衡树 - >这些是分支页面和根页面。仅从聚簇键导出的数据用作指向较低级别页面的指针。

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

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

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

如果有帮助,请告诉我。