代码之家  ›  专栏  ›  技术社区  ›  Nelssen

表扫描聚集表与索引扫描有什么区别

  •  0
  • Nelssen  · 技术社区  · 7 年前

    情况

    我有一个只有一个索引的表,一个聚集索引(两列)。 我执行“从表中选择”,优化器决定进行表扫描。

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

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

    问题

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

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

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

    请原谅我可能缺乏知识,我正在尽我最大的努力去理解潜在的概念。

    我是怎么测试的

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

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

    为什么这很重要

    因为我想保证订单,而不在集群表中使用order by子句。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Rich Campbell    7 年前

    在15.0及以上版本中,如果需要特定的顺序,请始终指定一个order by,因为数据和索引的结构在allpages和data only locked(DOL)表之间有所不同。

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

    只需添加order by,就可以了,因为select*无论如何都会转到tablescan,因为您需要整个表,因此不需要索引提示。

        2
  •  -1
  •   Nelssen    7 年前

    解释

    聚集索引按逻辑顺序排列,但按物理顺序排列。

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

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