當前位置:編程學習大全網 - 熱門推薦 - oracle 高效分頁查詢SQL

oracle 高效分頁查詢SQL

因為壹個功能需要讀取壹個大表的所有數據做業務處理,那這樣肯定不能壹次性查出所有數據,需要程序分頁查詢處理,模擬測試壹個200萬數據量的表發現耗時很久,並不是業務處理耗時,而且分頁查詢耗時了。oracle的分頁查詢可能大家都知道利用rownum,而且大部分公司這種分頁都是底層封裝好的了,所有平時大家使用的時候也沒註意(這次之後特意留意了壹下,我們公司就是用了錯誤的)

這兩條查詢語句看著區別不大,但是性能卻差很多。經過測試第壹種性能最好,而且隨著數量的增大,幾乎不受影響。第二種隨著數據量的增大,查詢速度也越來越慢。表200W條數據的情況下,第壹種查詢耗時基本是0.3s,第二種基本在1.3s以上。壹個查詢足足差了壹秒。別小看這1秒。200W條數據每次查詢1000條,查詢完也差了2000s=33分鐘.

分頁的目的就是控制輸出結果集大小,將結果盡快的返回。在上面的分頁查詢語句中,這種考慮主要體現在WHERE ROWNUM <= 20這句上。

這是由於CBO優化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。

對於正確有order by語句,第二層的查詢條件WHERE ROWNUM <= 20就可以被Oracle推入到內層查詢中,這樣Oracle查詢的結果壹旦超過了ROWNUM限制條件,就終止查詢將結果返回了

對於錯誤有order by 語句,由於查詢條件where b.rowno >= 11 and b.rowno <= 20是存在於查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道b.rowno代表什麽)。因此對於這個語句,Oracle最內層返回給中間層的是所有滿足條件的數據,而中間層返回給最外層的也是所有數據。數據的過濾在最外層完成,顯然這個效率要比第壹個查詢低得多。

上面分析的查詢不僅僅是針對單表的簡單查詢,對於最內層查詢是復雜的多表聯合查詢或最內層查詢包含排序的情況壹樣有效。

  • 上一篇:水滸傳108將的名字及綽號
  • 下一篇:在哪可以到這部電影
  • copyright 2024編程學習大全網