欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Oracle 数据库分页查询的几种写法-2 使用解析函数实现分页查询

最编程 2024-04-15 12:12:14
...

    上面的有序分析查询的语句用了2层子查询嵌套,看起来比较复杂,有没有看起来比较简单一点的写法?看起来简单的写法还是有的,用分析函数也可以实现有序分页查询,其实现的原理是先用分析函数排序,取得排序后的行号,根据行号查询所需要的页。上面的语句可以用分析函数改写一下:

select EMPNO,ENAME,SAL from
       (select row_number()  over(order by sal) rownumber, e.*
          from emp e)
       where rownumber >= 11 and rownumber <= 15;

改写后的语句的执行结果也是正确的,实际执行计划如下

----------------------------------------------------------------------------------------------------------------------
| Id  | Operation                | Name | Starts | E-Rows | A-Rows |   A-Time   | Buffers |  OMem |  1Mem | Used-Mem |
----------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |      |      1 |        |      5 |00:00:00.15 |   18267 |       |       |          |
|*  1 |  VIEW                    |      |      1 |     15 |      5 |00:00:00.15 |   18267 |       |       |          |
|*  2 |   WINDOW SORT PUSHED RANK|      |      1 |   1000K|     15 |00:00:00.15 |   18267 |  2048 |  2048 | 2048  (0)|
|   3 |    TABLE ACCESS FULL     | EMP  |      1 |   1000K|   1000K|00:00:00.04 |   18267 |       |       |          |
----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter(("ROWNUMBER">=11 AND "ROWNUMBER"<=15))
   2 - filter(ROW_NUMBER() OVER ( ORDER BY "SAL")<=15)

     从这条语句的实际执行计划来看,WINDOW SORT PUSHED RANK也是执行了15行之后就停止了操作,由于减少了子查询,实际的执行事件比子查询时还要少些,性能要稍好一点。

推荐阅读