Oracle 千萬級別資料查詢優化

2022-03-12 22:58:45 字數 1188 閱讀 6572

說明:平時很少接觸到大資料分頁,今天有興趣在資料庫插入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

200and

300

使用之後才發現效率還是比較慢,因為巢狀查詢內部每次都要檢索tabname的所有資料,故在此修改如下:

select

*from(  

select s.*,rownum rown from tabname s where rownum<

300order

by stuno desc

) m

where m.rown between

200and

300

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

PHP 千萬級別資料插入

header content type text html charset utf 8 設定 執行不受時間限制 set time limit 0 鏈結資料庫 con mysqli connect 127.0.0.1 root test if mysqli connect error 設定編碼為utf...

oracle千萬級資料查詢優化

需求 組合查詢,按條件統計某幾個欄位取前100條記錄 問題 沒建索引導致查詢結果耗時5秒多,不能忍受。解決方法 建索引,在哪個欄位建?在這裡先提下oracle的sql語句的執行。oracle在執行sql語句之前會用優化器optimizer對sql語句進行解析,解析出最優的執行計畫再執行,這樣所花費的...

Mysql千萬級別資料優化方案

一 目的與意義 1 說明 在mysql單錶中資料達到千萬級別時資料的分頁查詢結果時間過長,對此進行優達到最優效果,也就是時間最短 此統計利用的jdbc連線,其中fid為該錶的主鍵 二 解決思路與根據 本測試表中資料在千萬級別 1 建立索引 優點 當表中有大量記錄時,若要對錶進行查詢,第一種搜尋資訊方...