高效分页的SQL技巧(以Oracle为例)
一般的分页写法大概就是下面的样子(所谓的“三层嵌套”写法),
SELECT *
FROM (SELECT a.*
,rownum rn
FROM (SELECT * FROM table_name) a
WHERE rownum <= 40)
WHERE rn >= 21
在遇到显示数据表中1百万行以后的记录时,可能会出现性能问题。有人提出的解决方案是利用索引,首先通过扫描索引查出rowid,然后再通过rowid查出所需记录。这样做的问题是如果没有索引怎么办?以Oracle为例,下面是一个更具有一般意义的高效写法:
SELECT *
FROM<your table name> t
WHERE ROWID IN (SELECT rwd
FROM (SELECT t.rowid rwd
,rownum n
FROM<your table name> t
WHERE rownum <= 1000000 + 10)
WHERE n >= 1000000)
优化的思想是跳到第1百万位置时只是扫描了rowid,避免了扫描全部字段。当字段个数较多时,速度会有十倍的提升。本例在普通的设备上运行不到1秒就出来结果了。这一方法在千万级或亿级仍然存在问题,其原因在于循环次数并未减少。如果真有rwd这样一个字段,那么通过索引和分区等手段,也能够确保速度。不过,话又说回来,分页显示成百上千万条记录这样的事情,其欲达到的业务目的本身可否有更好的解决之道呢?
相关推荐
vitasfly 2020-11-12
gsmfan 2020-07-26
明月清风精进不止 2020-07-05
FORYAOSHUYUN 2020-07-05
URML 2020-07-04
minggehenhao 2020-06-21
hungzz 2020-06-16
oraclemch 2020-11-06
Seandba 2020-08-16
dbasunny 2020-08-16
娜娜 2020-06-22
专注前端开发 2020-10-21
苏康申 2020-11-13
liuyang000 2020-09-25
FellowYourHeart 2020-10-05
赵继业 2020-08-17
whyname 2020-08-16
拼命工作好好玩 2020-08-15