使用oracle的olap函数优化分页查询

周代码走查时发现由于分页功能需要根据总条数计算分页数 ,而目前项目组内的普遍做法是进行两次sql查询,一次用count(*)获得总条数,一次获取真正的展现数据。其实我们可以使用oracle提供的olap函数对此进行优化,通过伪列:count(*) over()即可获得当前sql的总条数。
      比如

select  t. * , count ( * over ()  from  dual

     会返回总条数为1。
 
      olap函数主要用于统计分析,熟练掌握能很好的提高sql执行效率。

      count(*) over() 具体功能描述如下:
       对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。
SAMPLE:下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数,n表示当前行的薪水
       例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行没有,所以count计数值cnt3为2(包括自己当前行);cnt2值相当于小于等于当前行的SALARY值的所有行数
       sql如下:

  SELECT  last_name, salary,  COUNT ( * OVER  ()  AS  cnt1,
           
COUNT ( * OVER  ( ORDER   BY  salary)  AS  cnt2,
           
COUNT ( * OVER  ( ORDER   BY  salary RANGE  BETWEEN   50  PRECEDING  AND   150  FOLLOWING)  AS  cnt3  FROM  employees;

      结果如下 :

LAST_NAME SALARY CNT2  CNT2 CNT3
Olson         210010713
Markle220010732
Philtanker220010732
Landry240010758
Gee240010758
Colmenares25001071110
Patel25001071010

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值