oracle查询优化学习

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

猜你喜欢

转载自ttkx1988.iteye.com/blog/2332206