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,从以下的执行计划也能看出差异来。