【问题标题】:oracle 11g using index on mixed order by statementoracle 11g 在混合顺序 by 语句上使用索引
【发布时间】:2016-10-15 04:34:42
【问题描述】:

创建表:

创建表测试1( N1 号码,N2 号码,N3 号码);

所以声明如下:

从测试 1 中选择 N3

WHERE N1=:绑定

按 N1 ASC、N2 DESC 排序;

在表格中插入一些数据:

开始

为我输入 1..200000

循环

插入 TEST1 值(

ROUND(DBMS_RANDOM.VALUE(1,20000))

,ROUND(DBMS_RANDOM.VALUE(1,20000))

,ROUND(DBMS_RANDOM.VALUE(1,20000))

);

结束循环;

结束;

现在我有以下索引:

CREATE INDEX IND ON TEST1(N1 ASC,N2 DESC);

CREATE INDEX IND ON TEST1(N1 DESC,N2 ASC);

运行执行计划我注意到降序索引扫描的成本更低。
has same order as in the order by
has reversed order as in the order by

我的问题是:这种情况是一直发生还是基于表中的数据? (与 order by 语句相比,索引参数总是必须按相反的顺序排列?

【问题讨论】:

  • 在查询中,您没有按顺序使用的列..那么在这种情况下,索引不用于按顺序排列..如果您想要真正的测试,您必须选择适合您的列需要按顺序
  • 它们现在的成本相同。他们中的任何一个仍然“更好”吗?如果我选择未索引的列,为什么成本会有所不同
  • 我已经发布了一个简短的分析器希望有用

标签: oracle oracle11g


【解决方案1】:

在查询中,您没有按顺序使用的列..那么在这种情况下,索引不用于排序..如果您想要真正的测试,您必须选择您需要按顺序排列的列

如果订单是 ASC 或 DESC,则成本相同,因为(最终)索引访问是相同的 ..

当您订购索引列或非索引列时,costi 是不同的,因为 order by 的信息是直接从 index 在第一种情况下获取的,否则必须为 table 获取..

【讨论】:

  • 问题是我仍然按索引列排序,我只是选择一个未索引的列。无论如何,我尝试反转订单并且发生了一些意想不到的事情:pastebin.com/CLaTuuKq 在第一种情况下,我的成本很高(尽管列是倒置的),而在第二种情况下,我得到的成本要低得多。所以我的猜测是在选择非索引列时它依赖于表中的数据?
  • 每个查询都依赖于表中的数据..(索引是表中数据的“顺序”副本..您可以查看这个简短的文档以获得一般概述@ 987654322@和docs.oracle.com/cd/B28359_01/server.111/b28310/indexes001.htm
猜你喜欢
  • 2018-08-01
  • 2022-01-15
  • 2019-09-02
  • 1970-01-01
  • 2012-01-01
  • 2021-06-19
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多