zoukankan      html  css  js  c++  java
  • order by 使用索引的情况

    order by使用索引 要保证那个列设置为非空

    以下只在oracle10g中测试:

    order by 使用索引是有条件的(只包括在有选择的此列上,不一定适应*的情况):

    1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
    2)ORDER BY中所有的列必须定义为非空.

    请看下面的测试:

    id为PK,a上有一般索引,b列没有索引

    执行下面两条语句,结果是先order by ,再执行rownum<20

    (1)select * from tb where rownum<20 order by id;

    但如果是这样:

    (2)select * from tb where rownum<20 order by b;

    (3) select * from tb where rownum<20 order by a;

    结果是先执行rownum<7,再order by

    这是为什么呢,跟主健及其上面的索引有关系:

    再看看下面的测试:----------------------------------------------------------------------------------------------------------

    ID是主健.

    SQL> select * from t;

            ID        ID1
    ---------- ----------
             1          2
             2          4
             4          3


    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   TABLE ACCESS (FULL) OF 'T'

    SQL> select * from t where rownum<3 order by id desc;

            ID        ID1
    ---------- ----------
             4          3
             2          4


    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   COUNT (STOPKEY)
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'T'
       3    2       INDEX (FULL SCAN DESCENDING) OF 'PK' (UNIQUE)
    '因为是主健,先进行索引的排序全表扫描,然后在count 2'

    SQL> select * from t where rownum<3 order by id1;

            ID        ID1
    ---------- ----------
             1          2
             2          4


    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (ORDER BY)
       2    1     COUNT (STOPKEY)
       3    2       TABLE ACCESS (FULL) OF 'T'
    '没有使用索引,先进行全表扫描,然后再count 2,再排序'

    为什么会使用pk的索引呢?一般的索引行吗?
    我们看看:

    1)在id1上创建索引


    SQL> create index id1idx on t(id1);

    索引已创建。
    SQL> select * from t where rownum<3 order by id1;

            ID        ID1
    ---------- ----------
             1          2
             2          4


    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   SORT (ORDER BY)
       2    1     COUNT (STOPKEY)
       3    2       TABLE ACCESS (FULL) OF 'T' '还是全表扫描'

    SQL> select * from t where id1>0 and rownum<3 order by id1;
    '加了id1>0 ,这样会使用到id1的索引'

            ID        ID1
    ---------- ----------
             1          2
             4          3


    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   COUNT (STOPKEY)
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'T'
       3    2       INDEX (RANGE SCAN) OF 'ID1IDX' (NON-UNIQUE)


    2)pk的索引是因为有order by 而使用的。order by 使用索引是有条件的:
    ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
    ORDER BY中所有的列必须定义为非空.

    因为id1是可以为空的,所以order by 不会使用它。而pk的索引是非空的,所以order by 会使用。

    我们将id1设为非空看看。


    SQL> alter table t
    2 modify (id1 int not null);

    表已更改。

    SQL> select * from t where rownum<3 order by id1;

            ID        ID1
    ---------- ----------
             1          2
             4          3


    Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=CHOOSE
       1    0   COUNT (STOPKEY)
       2    1     TABLE ACCESS (BY INDEX ROWID) OF 'T'
       3    2       INDEX (FULL SCAN) OF 'ID1IDX' (NON-UNIQUE)
    '这次,order by id1 使用了id1上的索引!'

    说明 如果该表上尚未创建聚集索引,且在创建 PRIMARY KEY 约束时未指定非聚集索引,PRIMARY KEY 约束会自动创建聚集索引。

  • 相关阅读:
    关于Xil_Assert断言产生的死循环,导致程序未执行的问题
    Unable to connect to ps7_cortexa9的参考解决方案Zedboard,zynq
    Xilinx SDK下载时出现的几个问题总结
    深入分析SCU GIC驱动 1 ZEDBOARD,ZYNQ7000
    Git命令行介绍和使用说明(持续更新)
    常用快捷键—Webstorm入门指南
    数组和链表的关系
    把Sublime Text 2固定到Ubuntu启动器
    Node的Eclipse插件 Nodeclipse
    Sublime 自定义格式化快捷键
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400554.html
Copyright © 2011-2022 走看看