• 【Oracle】-【ROWNUM与索引】-索引对ROWNUM检索的影响


    看到ASK TOM的一篇文章,挺有感触的。

    http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:32812348052

    主要问的是ROWNUM的问题。后面的一个讨论提问谈到:

    select ename, sal
    from emp
    where rownum<=10
    order by sal desc;

    select ename, sal
    from ( select ename, sal
    from emp
    order by sal desc)
    where rownum<=10;

    是否相同?


    第一个SQL是先找到ROWNUM<10的记录,然后排序。

    第二个SQL是先ORDER BY排序,再找ROWNUM<10的记录。

    因此两种查询得到的答案不同,当然有时也会碰巧相同。

    另外,如果表有索引,那么对于第二个SQL,可以从后面的记录开始读,避免排序。对于这个问题我做了实验:

    create table t as select * from dba_objects;

    create table t2 as select * from dba_objects;

    create index t2_i on t2(object_id);


    SQL> select * from (select owner, object_name, object_id from t order by object_id desc) where rownum<10;
    9 rows selected.

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3299198703
    ----------------------------------------------------------------------------------------
    | Id  | Operation               | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |      |     9 |   864 |       |  1189   (1)| 00:00:15 |
    |*  1 |  COUNT STOPKEY          |      |       |       |       |            |       |
    |   2 |   VIEW                  |      | 47308 |  4435K|       |  1189   (1)| 00:00:15 |
    |*  3 |    SORT ORDER BY STOPKEY|      | 47308 |  4435K|     9M|  1189   (1)| 00:00:15 |
    |   4 |     TABLE ACCESS FULL   | T    | 47308 |  4435K|       |   150   (1)| 00:00:02 |
    ----------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - filter(ROWNUM<10)
       3 - filter(ROWNUM<10)

    Note
    -----
       - dynamic sampling used for this statement

    Statistics
    ----------------------------------------------------------
              7  recursive calls
              0  db block gets
            793  consistent gets
              0  physical reads
              0  redo size
            878  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              9  rows processed


    SQL> select * from ( select owner, object_name, object_id from t2 order by object_id desc) where rownum < 10;
    9 rows selected.

    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 98068844
    ----------------------------------------------------------------------------------------
    | Id  | Operation               | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT        |      |     9 |   864 |       |  1164   (1)| 00:00:14 |
    |*  1 |  COUNT STOPKEY          |      |       |       |       |            |       |
    |   2 |   VIEW                  |      | 46110 |  4322K|       |  1164   (1)| 00
    :00:14 |
    |*  3 |    SORT ORDER BY STOPKEY|      | 46110 |  4322K|  9848K|  1164   (1)| 00:00:14 |
    |   4 |     TABLE ACCESS FULL   | T2   | 46110 |  4322K|       |   150   (1)| 00:00:02 |
    ----------------------------------------------------------------------------------------

    Predicate Information (identified by operation id):
    ---------------------------------------------------
       1 - filter(ROWNUM<10)
       3 - filter(ROWNUM<10)

    Note
    -----
       - dynamic sampling used for this statement

    Statistics
    ----------------------------------------------------------
              7  recursive calls
              0  db block gets
            791  consistent gets
              0  physical reads
              0  redo size
            878  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              1  sorts (memory)
              0  sorts (disk)
              9  rows processed

    第二个SQL仅比第一个SQL少2个consistent gets,不像讨论中说的会明显的变化。这个讨论是2001年的,不知道是不是版本的问题?我用的是10g。


    还请高手指点!

  • 相关阅读:
    oracle 10g正则表达式REGEXP_LIKE用法
    impdp时出现ORA-39125错误的解决方法
    使用rman恢复备份集到不同的主机上
    ORA-01110: data file 1: '/opt/ora10g/oradata/orcla/system01.dbf'错误
    Oracle模拟文件损坏BBED
    RMAN进行基于数据块的恢复
    转:Java中Image的水平翻转、缩放与自由旋转操作
    hue耗流量优化
    解决hue/hiveserver2对于hive date类型显示为NULL的问题
    解决kylin sync table报错:MetaException(message:java.lang.ClassNotFoundException Class org.apache.hive.hcatalog.data.JsonSerDe not found
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3233719.html
Copyright © 2020-2023  润新知