Oracle分頁查詢中排序與效率問題解決方法詳解
本文將結合作者近日工作中,在ORACLE資料庫分頁查詢時,遇到一個小問題,為大家講解如何解決Oracle分頁查詢中排序與效率問題。
原始未分頁查詢Sql程式碼如下:
select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX
t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1
order by ID
結果如下:
RN ID YYB XM MC
---------- ----------------- ----------------------
3 49 某證券總部 管理員 測試
4 96 某證券總部 管理員 持有上港10000股以上
5 102 某證券總部 管理員 十年規劃
14 105 某證券總部 管理員 開發渠道為上海
11 106 某證券總部 管理員 萬科A
12 107 某證券總部 管理員 11
13 108 某證券總部 管理員 今天過生日的客戶
2 109 某證券總部 管理員 客戶狀態正常
6 110 某證券總部 管理員 無交易
7 111 某證券總部 管理員 OA
8 112 某證券總部 管理員 幸運客戶
9 113 某證券總部 管理員 風險型
10 114 某證券總部 管理員 tst
22 115 白沙網上交易 安昌彪 安客戶正常
1 118 某證券總部 管理員 213
18 119 某證券總部 管理員 客戶號包含1008
17 120 某證券總部 管理員 aaa
19 123 某證券總部 管理員 ssssssss
20 124 某證券總部 管理員 www
21 126 某證券總部 管理員 123123
15 127 某證券總部 管理員 1212
16 128 某證券總部 管理員 aaaaaa
22 rows selected
最初我使用如下Sql程式碼查詢:
select * from (select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC
from tZDYSX t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and
t.gx = 1 order by t.ID )Where rn>10 and rn<=20;
這種方法能成功分頁,結果如下:
RN ID YYB XM MC
---------- ----------------- -------------------
14 105 某證券總部 管理員 開發渠道為上海
11 106 某證券總部 管理員 萬科A
12 107 某證券總部 管理員 11
13 108 某證券總部 管理員 今天過生日的客戶
18 119 某證券總部 管理員 客戶號包含1008
17 120 某證券總部 管理員 aaa
19 123 某證券總部 管理員 ssssssss
20 124 某證券總部 管理員 www
15 127 某證券總部 管理員 1212
16 128 某證券總部 管理員 aaaaaa
10 rows selected
從結果看來,有個問題:此語句Sql程式碼
order by CJSJ DESC 被執行,但是是在分後的第11到20條記錄的結果集中再進行排序,而不是先排序後分頁。(本來希望顯示ID為112到126,結果變為105到128)
後來變為以下Sql程式碼查詢:
SELECT *
FROM(
SELECT ROWNUM RN,TA.*
FROM(
select t.id ID, o.name YYB,u.name XM, t.MC
from tZDYSX t,tuser u,lborganization o
where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID
)TA WHERE ROWNUM <= 20
)WHERE RN > 10
SELECT *
FROM(
SELECT ROWNUM RN,TA.*
FROM(
select t.id ID, o.name YYB,u.name XM, t.MC
from tZDYSX t,tuser u,lborganization o
where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID
)TA WHERE ROWNUM <= 20
)WHERE RN > 10
結果如下:
RN ID YYB XM MC
---------- ----------------- -------------------
11 112 某證券總部 管理員 幸運客戶
12 113 某證券總部 管理員 風險型
13 114 某證券總部 管理員 tst
14 115 白沙網上交易 安昌彪 安客戶正常
15 118 某證券總部 管理員 213
16 119 某證券總部 管理員 客戶號包含1008
17 120 某證券總部 管理員 aaa
18 123 某證券總部 管理員 ssssssss
19 124 某證券總部 管理員 www
20 126 某證券總部 管理員 123123
10 rows selected
看來結果是正確的。
總結:第二種方法其中最內層的查詢Sql程式碼
select t.id ID, o.name YYB,u.name XM, t.MC
from tZDYSX t,tuser u,lborganization o
where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID
表示不進行翻頁的原始查詢語句。ROWNUM <= 20和RN > 10控制分頁查詢的每頁的範圍。
第二種方法在大多數情況擁有較高的效率。分頁的目的就是控制輸出結果集大小,在上面的分頁查詢語句中,這種考慮主要體現在WHERE ROWNUM <= 20這句上。
選擇第11到20條記錄存在兩種方法,第二種方法正是在查詢的第二層透過ROWNUM <= 20來控制最大值,在查詢的最外層控制最小值。而第一種方法是去掉查詢第二層的WHERE ROWNUM <= 20語句,在查詢的最外層控制分頁的最小值和最大值。
一 般來說,第二個查詢的效率比第一個高得多,這是由於CBO 最佳化模式下,Oracle可以將外層的查詢條件推到內層查詢中,以提高內層查詢的執行效率。對於第二個查詢語句,第2層的查詢條件WHERE ROWNUM <= 20就可以被Oracle推入到內層查詢中,這Oracle查詢的結果一旦超過了ROWNUM限制條件,就終止查詢將結果返回了。
而 第一個查詢語句,由於查詢條件Where rn>10 and rn<=20是存在於查詢的第三層,而Oracle無法將第三層的查詢條件推到最內層(即使推到最內層也沒有意義,因為最內層查詢不知道RN代表什 麼)。因此,對於第一個查詢語句,Oracle最內層返回給中間層的是所有滿足條件的資料,而中間層返回給最外層的也是所有資料。資料的過濾在最外層完 成,顯然這個效率要比第二個查詢低得多。
這種分頁對於單表查詢、多表查詢一樣有效。
oracle影片教程請關注:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/90618/viewspace-1173090/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中的SQL分頁查詢原理和方法詳解OracleSQL
- Oracle中SQL語句執行效率問題的查詢與解決OracleSQL
- 分頁查詢的排序問題排序
- 分頁查詢的排序問題(二)排序
- 解決oracle中not like效率問題Oracle
- Oracle中SQL語句執行效率的查詢與解決 (3)OracleSQL
- Oracle中SQL語句執行效率的查詢與解決 (2)OracleSQL
- Oracle中SQL語句執行效率的查詢與解決 (1)OracleSQL
- 查詢效率提升10倍!3種優化方案,幫你解決MySQL深分頁問題優化MySql
- 批次分頁查詢問題?
- 解決 mybatis一對多分頁問題 聯級查詢MyBatis
- plsql查詢亂碼問題解決SQL
- 詳解二分查詢
- oracle分頁查詢Oracle
- 第三章:查詢與排序(下)----------- 3.27 用計數排序解決員工年齡問題排序
- oracle連線查詢詳解Oracle
- Oracle提高查詢效率的方法Oracle
- Oracle的分頁查詢Oracle
- Oracle分頁查詢格式Oracle
- 請教批次分頁查詢的問題
- Oracle資料庫中的分頁查詢Oracle資料庫
- oracle心得3--多表查詢@分組查詢@子查詢講解與案例分析@經典練習題Oracle
- Oracle問題解決方法ORA-0Oracle
- Oracle分頁查詢格式(十三)Oracle
- Oracle分頁查詢格式(十二)Oracle
- Oracle分頁查詢格式(十一)Oracle
- Oracle分頁查詢格式(八)Oracle
- Oracle分頁查詢格式(九)Oracle
- Oracle分頁查詢格式(十)Oracle
- oracle分頁查詢語句Oracle
- Oracle分頁查詢之order byOracle
- oracle sql分頁查詢(一)OracleSQL
- 關於mysql查詢字符集不匹配問題的解決方法MySql
- oracle10g中部分檢視查詢非常‘慢“問題解決Oracle
- 問卷調查中常見問題及解決方法
- 快取穿透問題與解決方法快取穿透
- 今天遇到的問題與解決方法
- java中亂碼問題解決方法Java