gpt4 book ai didi

sql - 为什么非聚集索引扫描比聚集索引扫描快?

转载 作者:行者123 更新时间:2023-12-04 23:46:27 25 4
gpt4 key购买 nike

据我所知,堆表是没有聚集索引且没有物理顺序的表。
我有一个包含 120k 行的堆表“扫描”,我正在使用这个选择:

SELECT id FROM scan

如果我为“id”列创建一个非聚集索引,我会得到 223 次物理读取 .
如果我删除非聚集索引并更改表以将“id”设为我的主键(以及我的聚集索引),我会得到 515 次物理读取 .

如果聚集索引表是这样的图:

enter image description here

为什么聚集索引扫描像表扫描一样工作? (或者在检索所有行的情况下更糟)。为什么它不使用具有较少块并且已经具有我需要的 ID 的“聚集索引表”?

最佳答案

SQL Server 索引是 b 树。非聚集索引只包含索引列,b 树的叶节点是指向适当数据页的指针。聚集索引不同:它的叶节点是数据页本身,聚集索引的b-树成为表本身的后备存储;该表的堆不再存在。

您的非聚集索引包含一个单一的,大概是整数列。它是一个小而紧凑的索引。您的查询 select id from scan具有覆盖索引:只需检查索引即可满足查询,这就是正在发生的事情。但是,如果您的查询包含不在索引中的列,假设优化器选择使用非聚集索引,则需要额外的查找以从聚集索引或堆中获取所需的数据页。

要了解发生了什么,您需要检查优化器选择的执行计划:

  • Displaying Graphical Execution Plans
  • 见红门SQL Server Execution Plans , 作者:格兰特·弗里奇
  • 关于sql - 为什么非聚集索引扫描比聚集索引扫描快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27193877/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com