Oracle分页查询的优化方案

今天看到一份资料上有讲到Oracle分页处理时的查询优化方式,其思路是:对于要查询多列数据的一个分页查询语句,可以在内部的Oracle查询rownum时,不查询出所有要需要的列,而是查询一个rowid,再用一个表连接的方式,来查询所需要的列,这样就不会使用太多的*来查询,Oracle的sql语句解析器也就不会在解析sql语句时,消耗更多的资源,例子如下:

一般的查询分页查询方式是:
      SELECT * FROM 
 ( SELECT a.* ,ROWNUM rn FROM       --取得rownum值
   (SELECT t.* FROM dept t ORDER BY t.deptno)a  --查询整表的数据列,并按表某一个字段进行排序 
 WHERE ROWNUM<20) --对rownum大于20的进行过滤
  WHERE rn>2 --对rownum大于2的进行过滤
 
 
现在新的做法是:
SELECT t.* FROM dept t,   --表连接,关联查询
  (SELECT rd FROM ( --取得所有的rowid
SELECT rd,rn FROM 
(SELECT ROWID rd,ROWNUM rn FROM dept ORDER BY deptno) --查询整表rowid和rownum,并按进行排序 
WHERE rn<20) --过滤rownum大于20的数据
  WHERE rn >2) t1 --过滤rownum小于2的数据
  WHERE t.ROWID = t1.rd

猜你喜欢

转载自shiguanghui.iteye.com/blog/1948817