oracle 后台函数,Oracle分析函数(用row_number做后台分页)实例讲解

提到Oracle的分析函数,最常用的就是row_number、rank、dense_rank这3个函数,具体的用法有无数的文章写过,就不重复了,这里只描述一个row_number的使用场景。

大家都知道,分页是个比较复杂的问题,如果数据量比较大,前台一次性缓存的性能就很差,一般都会考虑后台分页取数,这时就需要数据库做分页支持。然后oracle数据库并没有MYSQL里面的limit语法,所以分页一般都用子查询做支持,接下来尝试一下常用的几种SQL分页写法,先建一张测试数据表,并写入100万条数据用于测试。

193389_0.png

设定2个变量,每页N_COUNTPERPAGE条,取第N_PAGE页数据,假设N_COUNTPERPAGE=10,N_PAGE=70001,应该取出sn在(700001~700010)的数据

第一种SQL写法:

193389_1.png

第二种方法,改为row_number()函数

193389_2.png

这2种方法都是通过页数计算出需要获取的列号,然后从表里直接取计算好的一页数据,下面还有一个更加直观的做法,就是先按每行N_COUNTPERPAGE条数据分好页,然后将第N_PAGE页第N_ROW行数据取出来:

193389_3.png

从上面的几个方法看,其实用row_number分页的速度没有提升,之前很多人觉得用了这个高级一点的函数就会显著提升性能也只是主观判断而已。先分页再取数的速度肯定比不上计算行号的方法。

另外,后台分页有一个不可避免的缺点,就是数据变化比较频繁会导致数据遗漏、重叠等,比如取完第1页后,后台删掉了第1页的全部数据,接下去取第2页(实际已经是之前的第3页),会漏掉原本的第2页数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值