table 扫描集群 table 与索引扫描之间有什么区别

Whats the difference between table scanning a clustered table, vs index scanning

情况

我有一个 table 只有一个索引,一个聚簇索引(两列)。 我做了一个 'SELECT * FROM TABLE' 并且优化器决定了一个 Table 扫描。

我得到的行有点按聚集索引排序。我说有点因为它看起来不是随机排序的,但它有很多小故障。

如果我强制使用聚集索引 SELECT * FROM TABLE(索引 1 MRU),我会得到准确的聚集 table 顺序。

问题

如果聚簇 table 中的数据按其索引排序,table 扫描结果与聚簇索引扫描的顺序有何不同?

聚集索引中的 table 扫描是扫描到 table 的叶级别,那些不是排序的吗?

聚簇索引扫描是有序扫描到b-tree的所有可能路径吗?

请原谅我可能缺乏知识,我正在尽力理解基本概念。

我是如何测试这个的

我通过测试两个不同的聚簇索引(一个有两列,另一个有一列)得到了这种不一致的排序结果。创建和删除约束并检查 select 语句。

在截断 table 并创建索引后,数据已正确排序,但在删除索引并创建不同的索引后,数据未通过 table 扫描完美排序。我需要强制使用索引。

为什么这很重要

因为我想在集群 table 中不使用 order by 子句来保证顺序 table。

在 15.0 及更高版本上,如果您想要一个特定的顺序,请始终指定一个顺序,因为数据和索引的结构在所有页面和仅锁定的数据 (DOL) 之间变化 tables。

优化器可能会选择在幕后并行执行部分查询检索,例如,这取决于您的并行度设置,这就是 order by 很重要的原因。只是说 select * 没有要求任何特定订单。

只需添加订单即可,因为 select * 无论如何都会 table 扫描,因为您要求整个 table 因此没有需要索引提示。

解释

聚簇索引在逻辑上是有序的,但在物理上不是有序的。

这意味着 table 扫描如果按物理顺序完成,将 return 与按逻辑排序的聚集索引扫描不同的结果。

此逻辑-物理映射由 OAM(对象分配映射)控制