自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解決Oracle分頁(yè)查詢中排序與效率問(wèn)題

數(shù)據(jù)庫(kù) Oracle 數(shù)據(jù)庫(kù)運(yùn)維
本文將結(jié)合作者近日工作中,在ORACLE數(shù)據(jù)庫(kù)分頁(yè)查詢時(shí),遇到一個(gè)小問(wèn)題,為大家講解如何解決Oracle分頁(yè)查詢中排序與效率問(wèn)題。

原始未分頁(yè)查詢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 

結(jié)果如下:
  RN    ID      YYB       XM     MC
---------- ----------------- ----------------------
   3     49  某證券總部     管理員 測(cè)試
   4     96  某證券總部     管理員 持有上港10000股以上
   5    102 某證券總部     管理員 十年規(guī)劃
  14   105 某證券總部     管理員 開發(fā)渠道為上海
  11   106 某證券總部     管理員 萬(wàn)科A
  12   107 某證券總部     管理員 11
  13   108 某證券總部     管理員 今天過(guò)生日的客戶
   2    109 某證券總部     管理員 客戶狀態(tài)正常
   6    110 某證券總部     管理員 無(wú)交易
   7    111 某證券總部     管理員 OA
   8    112 某證券總部     管理員 幸運(yùn)客戶
   9    113 某證券總部     管理員 風(fēng)險(xiǎn)型
  10   114 某證券總部     管理員 tst
  22   115 白沙網(wǎng)上交易   安昌彪 安客戶正常
   1    118 某證券總部     管理員 213
  18   119 某證券總部     管理員 客戶號(hào)包含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; 

這種方法能成功分頁(yè),結(jié)果如下:
  RN    ID        YYB       XM      MC
---------- ----------------- -------------------
  14   105 某證券總部     管理員 開發(fā)渠道為上海
  11   106 某證券總部     管理員 萬(wàn)科A
  12   107 某證券總部     管理員 11
  13   108 某證券總部     管理員 今天過(guò)生日的客戶
  18   119 某證券總部     管理員 客戶號(hào)包含1008
  17   120 某證券總部     管理員 aaa
  19   123 某證券總部     管理員 ssssssss
  20   124 某證券總部     管理員 www
  15   127 某證券總部     管理員 1212
  16   128 某證券總部     管理員 aaaaaa

10 rows selected

從結(jié)果看來(lái),有個(gè)問(wèn)題:此語(yǔ)句Sql代碼
order by CJSJ DESC  被執(zhí)行,但是是在分后的第11到20條記錄的結(jié)果集中再進(jìn)行排序,而不是先排序后分頁(yè)。(本來(lái)希望顯示ID為112到126,結(jié)果變?yōu)?05到128)

后來(lái)變?yōu)橐韵耂ql代碼查詢: 

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

結(jié)果如下:
  RN    ID     YYB           XM     MC
---------- ----------------- -------------------
  11   112 某證券總部     管理員 幸運(yùn)客戶
  12   113 某證券總部     管理員 風(fēng)險(xiǎn)型
  13   114 某證券總部     管理員 tst
  14   115 白沙網(wǎng)上交易   安昌彪 安客戶正常
  15   118 某證券總部     管理員 213
  16   119 某證券總部     管理員 客戶號(hào)包含1008
  17   120 某證券總部     管理員 aaa
  18   123 某證券總部     管理員 ssssssss
  19   124 某證券總部     管理員 www
  20   126 某證券總部     管理員 123123

10 rows selected

看來(lái)結(jié)果是正確的。

總結(jié):第二種方法其中最內(nèi)層的查詢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 

表示不進(jìn)行翻頁(yè)的原始查詢語(yǔ)句。ROWNUM <= 20和RN > 10控制分頁(yè)查詢的每頁(yè)的范圍。
第二種方法在大多數(shù)情況擁有較高的效率。分頁(yè)的目的就是控制輸出結(jié)果集大小,在上面的分頁(yè)查詢語(yǔ)句中,這種考慮主要體現(xiàn)在WHERE ROWNUM <= 20這句上。

選擇第11到20條記錄存在兩種方法,第二種方法正是在查詢的第二層通過(guò)ROWNUM <= 20來(lái)控制最大值,在查詢的最外層控制最小值。而第一種方法是去掉查詢第二層的WHERE ROWNUM <= 20語(yǔ)句,在查詢的最外層控制分頁(yè)的最小值和最大值。

一般來(lái)說(shuō),第二個(gè)查詢的效率比第一個(gè)高得多,這是由于CBO 優(yōu)化模式下,Oracle可以將外層的查詢條件推到內(nèi)層查詢中,以提高內(nèi)層查詢的執(zhí)行效率。對(duì)于第二個(gè)查詢語(yǔ)句,第2層的查詢條件WHERE ROWNUM <= 20就可以被Oracle推入到內(nèi)層查詢中,這Oracle查詢的結(jié)果一旦超過(guò)了ROWNUM限制條件,就終止查詢將結(jié)果返回了。

而第一個(gè)查詢語(yǔ)句,由于查詢條件Where rn>10 and rn<=20是存在于查詢的第三層,而Oracle無(wú)法將第三層的查詢條件推到最內(nèi)層(即使推到最內(nèi)層也沒(méi)有意義,因?yàn)樽顑?nèi)層查詢不知道RN代表什么)。因此,對(duì)于第一個(gè)查詢語(yǔ)句,Oracle最內(nèi)層返回給中間層的是所有滿足條件的數(shù)據(jù),而中間層返回給最外層的也是所有數(shù)據(jù)。數(shù)據(jù)的過(guò)濾在最外層完成,顯然這個(gè)效率要比第二個(gè)查詢低得多。

這種分頁(yè)對(duì)于單表查詢、多表查詢一樣有效。

【編輯推薦】

  1. 云數(shù)據(jù)庫(kù)技術(shù)漸熱 各廠商上演多方斗法
  2. 甲骨文推出Oracle托管型CRM R16新功能
  3. Oracle數(shù)據(jù)庫(kù)中段管理的四個(gè)技巧
責(zé)任編輯:彭凡 來(lái)源: javaeye
相關(guān)推薦

2010-04-30 10:01:09

Oracle 分頁(yè)

2010-10-27 15:40:14

oracle分頁(yè)查詢

2010-04-16 16:12:51

jdbc分頁(yè)

2010-10-27 10:11:07

Oracle分頁(yè)查詢

2010-11-18 13:32:12

Oracle分頁(yè)查詢

2010-11-15 16:46:49

Oracle查詢效率

2010-04-23 16:35:02

Oracle 查詢記錄

2012-07-23 14:30:33

Oracle

2009-04-09 13:14:09

Oracle分頁(yè)查詢CBO

2010-05-04 15:15:39

Oracle分頁(yè)查詢

2011-10-11 10:49:25

Oracle

2010-10-25 10:55:11

Oracle函數(shù)索引

2011-08-19 09:30:42

分頁(yè)查詢SQL ServerMySQL

2010-04-12 09:26:52

Oracle查詢分頁(yè)

2010-05-06 14:11:55

Oracle多條件查詢

2021-01-20 06:09:30

堆排序TopK應(yīng)用場(chǎng)景

2022-01-10 10:12:58

MySQL分頁(yè)數(shù)據(jù)

2011-08-29 17:47:07

PHPMySQL排序

2024-12-05 09:06:58

2009-08-14 13:20:29

ASP.NET Gri
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)