前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Oracle】-【ROWNUM与索引】-索引对ROWNUM检索的影响

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

作者头像
bisal
发布2019-01-29 10:47:14
9900
发布2019-01-29 10:47:14
举报

看到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。

还请高手指点!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013年08月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档