【问题标题】:Whats the difference between table scanning a clustered table, vs index scanning表扫描聚簇表与索引扫描有什么区别
【发布时间】:2018-06-18 08:37:39
【问题描述】:

情况

我有一个只有一个索引的表,一个聚集索引(两列)。 我执行“SELECT * FROM TABLE”,优化器决定进行表扫描。

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

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

问题

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

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

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

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

我是如何测试的

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

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

为什么这很重要

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

【问题讨论】:

    标签: sybase sap-ase sybase-ase15


    【解决方案1】:

    解释

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

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

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

    【讨论】:

    • 是和不是。如果您使用所有页面锁定,则聚集索引确实 对数据进行物理排序。如果您使用数据页/数据行锁定,则聚集索引将属于您所说的“逻辑排序”。
    • 嗨,马克,我正在使用数据行锁定方案 :) 感谢您提供额外信息。你能提供一个来源,以便我可以更新答案吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 这很有意义,我还尝试通过将并行度参数化为 1 来进行串行处理,期望得到与表格顺序一致的东西。但它也失败了。我们该如何解释呢?如果只有一个线程并且表是聚集的(数据已排序),他如何呈现未排序的结果?
    • 有问题的表的锁定方案是什么?我怀疑它的 DOL 在这种情况下,数据不会像在所有页锁定表上那样按照严格的索引键顺序排序。请参阅:infocenter-archive.sybase.com/help/index.jsp?topic=/… '如果没有 order by 子句,仅数据锁定表上的聚集索引可能不会以聚集键顺序返回行。不保证批量复制以聚集键顺序复制出一个表。这是 DOL 与所有页面锁定的主要区别之一。
    • 嗨@Rich Campell,感谢您的帮助,我能够找出问题所在。这是我知识的支柱是错误的。聚集索引不是物理排序的,而是逻辑排序的。干杯
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2019-08-26
    • 2015-01-25
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多