Oracle 千萬級別數據查詢優化


說明:平時很少接觸到大數據分頁,今天有興趣在數據庫插入1000萬條數據進行測試,經過查詢相關資料得到如下說明:
筆者在工作中有一上百萬條記錄的表,在jsp頁面中需對該表進行分頁顯示,便考慮用rownum來做,下面是具體方法(每頁顯示20條):
語句:"select * from tabname where rownum<20 order by name"
但卻發現oracle卻不能按自己的意願來執行,而是先隨便取20條記錄,然后再 order by,后經咨詢oracle,說rownum確實就這樣,想用的話,只能用子查詢來實現先排序,后rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但這樣一來,效率會較低很多。
后經筆者試驗,只需在order by 的字段上加主鍵或索引即可讓oracle先按該字段排序,然后再rownum;方法不變:
"select * from tabname where rownum<20 order by name"

----------------------------------------------------------------

涉及到大數據量的查詢時我們一般不會想要全部查看,而只是想要匯總、根據條件篩選、查詢前面幾頁數據等。鑒於此用上面的解決方案卻不能查詢從21到40之間的數據,特修改語句如下:

select * from
(
  select s.*,rownum rowN from tabname s order by stuno desc
) m where m.rowN between 200 and 300

使用之后才發現效率還是比較慢,因為嵌套查詢內部每次都要檢索tabname的所有數據,故在此修改如下:

select * from
(
  select s.*,rownum rowN from tabname s where rownum<300 order by stuno desc
) m where m.rowN between 200 and 300

因為查詢的是前200到300之間的數據,所以沒有比較檢索表中所有數據,故在嵌套查詢內部加了個rownum<300進行篩選。當我們越是往后面分頁,那么嵌套查詢內部數據越大,效率就越低,但是如果只考慮查詢前面幾頁數據,無疑是最好的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM