天天看點

rownum應用系列之分頁查詢

rownum這個僞列在SQL中用途廣泛,歸納起來大緻有3總用法:

1、分頁查詢 rownum<= :b1 and RN>:b2 (rownum不能>)

2、rownum<= :b1

3、rownum=1 或 rownum<=1 ,也是rownum<=:b1的一種特例

我們接下來分别會找相關的優化案例來進行分析。

今天先談談簡單的分頁查詢寫法,雖然是老生常談,但是因為在很多客戶的大型系統中都發現了低效寫法,還是再重新加強一下,如果能做成開發規範最好:

低效的寫法:

select column_lists from

(select rownum as rn,A.* from

(select column_lists from table_name where col_1=:b0 order by col_2) A

) where rn<=:b2 and rn>:b1;

高效的寫法,注意紅色部分内容的位置:

select column_lists from

(select rownum as rn,A.* from

(select column_lists from table_name where col_1=:b0 order by col_2) A

where rownum<=:b2

) where rn>:b1;

原理:

低效寫法需要将内層的結果集全部排序,再從中取出需要的部分;而高效寫法隻需要擷取排序後<=:b2部分的結果就可以了。

一般分頁查詢通路前面部分頁面的幾率較大,内層查詢的結果集越大,性能差距越明顯。

如果是通路分頁的最後部分的頁面,基本上就沒什麼差别了。

oracle 12c 中使用了簡潔的offset 文法,其實是使用了分析函數row_number()在内部做了改寫,效率也很高。目前的主流寫法還是上面使用rownum僞列的方法。

思考一下:

這樣的分頁查詢語句,應該建立怎樣的索引?