標籤:
說明:平時很少接觸到大資料分頁,今天有興趣在資料庫插入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進行篩選。當我們越是往後面分頁,那麼巢狀查詢內部資料越大,效率就越低,但是如果只考慮查詢前面幾頁資料,無疑是最好的方式。
Oracle 千萬層級資料查詢最佳化