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

在order by子句期间使用索引?

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

    我已经在employee表的created_date列上创建了索引,但当我看到下面查询的解释计划时 我看不到正在使用索引。为什么?

        Select * from employee order by created_date desc;
    

    根据我的理解,oracle将以排序方式(使用B树)保留创建的日期以及行id

    若它不使用索引,那个么它将获取内存中的所有数据,然后对其排序并返回。不是吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Barbaros Özhan    7 年前

    很可能是你的 created_date 列可为null。添加

    where created_date is not null
    

    对于您的问题,

    从员工中选择* where created_date is not null 订购人 创建日期描述;

    explain plan 再一次

    Oracle检查数据量(我们可以从 dba_tables ,也可以手动),如果 CBO ( Cost based optimization ,在大多数系统中,首选这种类型的优化,而不是 Rule-based optimization )并对相关表格进行了分析。

    • 这个 国会预算办公室 使用数据库统计信息生成 execution plans ,选择成本最低的一个,其中成本与 完成操作所需的系统资源。
        2
  •  1
  •   mathguy    7 年前

    您必须读取基表中的所有行,对吗?要从磁盘上读取所有数据,最快的方法是逐块大容量读取,而不管它们在磁盘上的顺序如何。这将最大限度地减少从硬盘读取的次数。

    您的建议:

    是的,这样您就已经对行进行了排序(您可以避免CPU对行进行排序)。但您还有更多的磁盘读取操作。为了弥补一些数字:您节省了0.8秒的CPU工作,并将I/O时间增加了40秒。(纯属虚构,但在比较中可能是正确的数量级。)