oracle
rownum:分页查询时可用伪列rownum,rownum只支持<,<=,!=, 所以分页查询需要使用子查询
例子:
select * from (select t.*, ROWNUM RN from table t ) a where a.RN between 5 and 10
rownid:表中每行数据都有唯一的地址标志
查询数据时,根据条件索引时,将查询该条数据的rowid返回,再回表查询该条rowid所在数据的数据。
所以,当select的字段都能在索引项时,则不需要再回表查询。
当然,一张表建立过多的索引也不是解决查询的根本
所以在大数据量查询时,若能取到具体分页数据的rowid,相信查询的效率会高很多
例1:
select row_.*, rownum rownum_
from (select t.*, ROWNUM rn
from table t
where create_time >= to_date('2016-10-19 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
order by id) row_
where row_.rn between 4000 and 5000
例2:
select b.*
from (select rn
from (select row_.*, rownum rownum_
from (select rowid rn
from table t
where create_time >=
to_date('2016-10-19 00:00:00',
'yyyy-mm-dd hh24:mi:ss')
order by id) row_
where rownum <= 5000)
where rownum_ > 4000) a,
table b
where rn = b.rowid order by id
通过查看执行计划,两条sql查询无论从扫描数据的行数,消耗内存,耗时等因素例2则高很多
参考:
http://blog.csdn.net/lang_man_xing/article/details/7353789
http://blog.csdn.net/chenxizhiyi/article/details/6331849