欢迎投稿

今日深度:

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

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


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

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

\

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

第一种SQL写法:

\

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

\

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

\

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

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

www.htsjk.Com true http://www.htsjk.com/oracle/24283.html NewsArticle Oracle分析函数(用row_number做后台分页)实例讲解,oraclerow_number 提到Oracle的分析函数,最常用的就是row_number、rank、dense_rank这3个函数,具体的用法有无数的文章写过,就不重复了,这里...
评论暂时关闭