Oralce分页 rownum是在查询过程中生成的,因此以下的SQL其实是查出来5300行,然后扔掉了前面5000行,返回后面的300行。当然这种已经进了一大步的,由数据库返回的数据变少的,只是当查询的页数比较大的时候,查询还是存在一定的浪费。

SELECT *
  FROM (SELECT A.*, ROWNUM AS RNUM
          FROM (SELECT * FROM yz_bingrenyz ) A
         WHERE ROWNUM < 5300)
 WHERE RNUM >= 5000

Linq提供了Skip和Take的API可以用于分页,由于使用的是Entity Framework,在好奇的驱使下用EFProfiler查看生成的SQL,才知道这样以下分页更好。 主要就是使用了row_numer()over()这样的分析函数,可以直接找到那第5000行开始的地方,然后在取出300行就行了。

SELECT COUNT(1)
  FROM (SELECT *
          FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY NULL) AS "row_number"
                  FROM yz_bingrenyz T) P
         WHERE P."row_number" >= 5000) Q
 WHERE ROWNUM <= 300

比较分析:

本机测试前者耗时1.3s,后者仅0.25s,从以下的执行计划也能看出差异来。 

Oracle数据库查询高效分页精简_Oracle高效分页

Oracle数据库查询高效分页精简_Oracle高效分页_02