Oracle 千萬層級資料查詢最佳化

來源:互聯網
上載者:User

標籤:

說明:平時很少接觸到大資料分頁,今天有興趣在資料庫插入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 千萬層級資料查詢最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.