关于Oracle的rownum大家并不陌生,很多人说是一个查询出结果后的伪列,是从1开始的,使用rownum过滤时必须从1开始等。rownum是怎样一个伪列,我们一会讨论;rownum是从1开始的,但是既然是伪列,为什么必须从1开始,下面我们一点点剖析。
本此博客主要讨论以下几个问题
①,rownum是什么及简要算法;
②,因为rownum,执行计划中COUNT STOPKEY是怎么回事;
③,利用rownum的COUNT STOPKEY进行分页SQL优化。
0,数据准备
drop table test1 ;
create table test1 as select * from dba_objects;
alter table TEST1 add constraint PK_TEST1 primary key (OBJECT_ID);
drop table test2;
create table test2 as select * from test1 where rownum<100; --只插入99条数据
1,一位美女的问题引出rownum是什么
前几天,有位美女提出了类似这样一个问题:
select * from test2 t where rownum=trunc(dbms_random.value(0,100));
这个语句实际返回结果是0-n条不等,按照很多人的解释,rownum过滤时必须从1开始,用随机数做条件,返回结果只能时0条或者1条,大于1条是怎么回事?
当我们不知道原因时,首先看看执行计划,看看数据库是怎么执行这句SQL的。