问题1、rownum正序是指什么?
问题2、rownum和order by语句在一起时,执行的先后顺序是什么?order by语句如何影响rownum正序?
问题3、rownnum与索引之间的关系?
-- Create table
create table DAIMIN
( ID NUMBER not null,
PARENTID NUMBER
);
alter table daimin add constraint pk_daimin primary key(id);
SQL> select *from DAIMIN;
ID PARENTID
---------- ----------
1 6
2 3
5 1
3 2
问题1、rownum正序是指什么?
rownum正序是指rownum的返回是按照1,2,3依次递增,如上面的查询显示的效果
问题2、rownum和order by语句在一起时,执行的先后顺序是什么?order by语句如何影响rownum正序?
下面执行两个语句进行比较:
SQL> select rownum as r, t.ID from daimin t order by t.ID;
R ID
---------- ----------
1 1
2 2
3 3
4 5
现象:是rownum是按照正序来返回的
该语句的执行计划如下:
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | COUNT | | | | |
| 2 | INDEX FULL SCAN | PK_DAIMIN | | | |
--------------------------------------------------------------------
现象:使用了PK_DAIMIN这个主键索引,并且从执行计划中看出COUNT操作之后没有SORT ORDER BY操作
(Rownum事实上在COUNT (STOPKEY)时产生)
SQL> select rownum as r, t.parentid from daimin t order by t.parentid;
R PARENTID
---------- ----------
3 1
4 2
2 3
1 6
现象:是rownum没有按照正序来返回
该语句的执行计划如下:
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | SORT ORDER BY | | | | |
| 2 | COUNT | | | | |
| 3 | TABLE ACCESS FULL | DAIMIN | | | |
--------------------------------------------------------------------
现象:没有使用索引查询 ,并且在COUNT操作之后有SORT ORDER BY操作
分析:为什么这两句SQL语句返回的rownum不一样呢?
主要是由于第一句使用了索引已经排好序,然后再产生Rownum,此时已经是按照parentid排好序的顺序,
再按照parentid排序之后原来的rownum标识不会被打乱,所以返回的rownum是正序;
而第二句则使用全表扫描,在全表扫面是查询出来的结果集是按照表中原有的记录的先后顺序来返回的,
然后在COUNT操作时给返回的记录标记1,2,3,在标好标记之后再按照parentid字段排序,这样就将原来
在COUNT时的顺序打乱,重新排序,所以返回的rownum不是正序。
问题3、rownnum与索引之间的关系?是不是建了某个字段的索引都会使用索引呢(在没有改字段的where条件的情况下)?
下面做测试试验:
给DAIMIN表中的PARENTID字段建索引
create index DM_PARENTID on DAIMIN (PARENTID);
select rownum as r, t.parentid from daimin t order by t.parentid;
其执行计划:
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | SORT ORDER BY | | | | |
| 2 | COUNT | | | | |
| 3 | TABLE ACCESS FULL | DAIMIN | | | |
--------------------------------------------------------------------
查询结果:
SQL> select rownum as r, t.parentid from daimin t order by t.parentid;
R PARENTID
---------- ----------
3 1
4 2
2 3
1 6
分析:给parentid字段建了索引,但是该语句并没有使用索引,仍然采用的是全表扫描,所以返回的rownum仍然不是正序。
![]()
由于各种原因,我们无法获知[rownum和order by 以及index的关系]原创作者,如侵犯了您的版权,请您及时联系我们!

