0

情况

我有一个只有一个索引的表,一个聚集索引(两列)。我做了一个'SELECT * FROM TABLE',优化器决定一个表扫描。

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

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

问题

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

聚集索引中的表扫描是对表的叶级别的扫描,不是排序的吗?

聚集索引扫描是否以有序的方式扫描到 b 树的所有可能路径?

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

我是如何测试的

我通过测试两个不同的聚集索引(一个包含两列,另一个包含一列)来实现这种不一致的排序结果。创建和删除约束并检查 select 语句。

在截断表并创建索引后,数据已正确排序,但在删除索引并创建另一个索引后,该数据未通过表扫描完美排序。我需要强制使用索引。

为什么这很重要

因为我想在不使用聚簇表中的 order by 子句的情况下保证订单。

4

2 回答 2

1

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

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

只需添加 order by 就可以了,因为 select * 无论如何都会进行表扫描,因为您要求的是整个表,因此不需要索引提示。

于 2018-01-12T13:53:48.333 回答
-1

说明

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

这意味着如果按物理顺序进行表扫描,将返回与按逻辑排序的聚集索引扫描不同的结果。

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

于 2018-02-09T10:49:01.493 回答