Oracle資料庫中分頁查詢中排序及效率問題

2021-05-23 05:46:42 字數 4824 閱讀 1475

原始未分頁查詢sql**如下:

select

rownum

rn,t.

id id,

o.name

yyb,

u.name

xm,t.

mc from

tzdysx t,

tuser u,

lborganization o wheret.

cjr=

u.id and

u.orgid=

o.orgcode andt.

gx =

1 order

by id

結果如下:

rnid

yybxmmc3

49某**總部

管理員測試496

某**總部

管理員持有上港10000股以上

5102

某**總部

管理員十年規劃

14105

某**總部

管理員開發渠道為上海

11106

某**總部

管理員萬科a

12107

某**總部

管理員11

13108

某**總部

管理員今天過生日的客戶

2109

某**總部

管理員客戶狀態正常

6110

某**總部

管理員無交易

7111

某**總部

管理員oa

8112

某**總部

管理員幸運客戶

9113

某**總部

管理員風險型

10114

某**總部

管理員tst

22115

白沙網上交易

安昌彪安客戶正常

1118

某**總部

管理員213

18119

某**總部

管理員客戶號包含1008

17120

某**總部

管理員aaa

19123

某**總部

管理員ssssssss

20124

某**總部

管理員www

21126

某**總部

管理員123123

15127

某**總部

管理員1212

16128

某**總部

管理員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 wheret.

cjr=

u.id and

u.orgid=

o.orgcode andt.

gx =

1 orderbyt

.id )

where

rn>

10 and

rn<

=20;

這種方法能成功分頁,結果如下:

rnid

yybxm

mc14

105某**總部

管理員開發渠道為上海

11106

某**總部

管理員萬科a

12107

某**總部

管理員11

13108

某**總部

管理員今天過生日的客戶

18119

某**總部

管理員客戶號包含1008

17120

某**總部

管理員aaa

19123

某**總部

管理員ssssssss

20124

某**總部

管理員www

15127

某**總部

管理員1212

16128

某**總部

管理員aaaaaa

10 rows selected

從結果看來,有個問題:此語句sql**

order by cjsj desc  被執行,但是是在分後的第11到20條記錄的結果集中再進行排序,而不是先排序後分頁。(本來希望顯示id為112到126,結果變為105到128)

後來變為以下sql**查詢:

sql code

複製**

select

*from

(select

rownum

rn,ta.*

from

(selectt.

id id,

o.name

yyb,

u.name

xm,t.

mc

from

tzdysx t

,tuser u,

lborganization o

wheret.

cjr=

u.id and

u.orgid=

o.orgcode andt.

gx =

1 orderbyt

.id

)ta where

rownum

<

= 20

)where

rn >

10 select

*from

(select

rownum

rn,ta.*

from

(selectt.

id id,

o.name

yyb,

u.name

xm,t.

mcfrom

tzdysx t

,tuser u,

lborganization o

wheret.

cjr=

u.id and

u.orgid=

o.orgcode andt.

gx =

1 orderbyt

.id)ta where

rownum

<

= 20

)where

rn >

10

結果如下:

rnid

yybxm

mc11

112某**總部

管理員幸運客戶

12113

某**總部

管理員風險型

13114

某**總部

管理員tst

14115

白沙網上交易

安昌彪安客戶正常

15118

某**總部

管理員213

16119

某**總部

管理員客戶號包含1008

17120

某**總部

管理員aaa

18123

某**總部

管理員ssssssss

19124

某**總部

管理員www

20126

某**總部

管理員123123

10 rows selected

看來結果是正確的。

總結:第二種方法其中最內層的查詢sql**

selectt.

id id,

o.name

yyb,

u.name

xm,t.

mc

from

tzdysx t

,tuser u,

lborganization o

wheret.

cjr=

u.id and

u.orgid=

o.orgcode andt.

gx =

1 orderbyt

.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中分頁查詢

上限條件必須放在子查詢,而下限條件必須放在外層查詢 rownum總是從1開始的,第一條不滿足去掉的話,第二條的rownum 又成了1 select from select rownum rowno,t.from tab t where rownum page size tab alias where...

Oracle中分頁查詢介紹

設有a表,pageindex 頁號 pagesize 頁大小 我們知oracle中提供了rownum欄位,我們可利用它實現分頁查詢 具體如 step1 先獲得乙個較大的父集,在構成此集合的過程中我們可以構建一定查詢規則 sql code select rownum as r,a.from a a o...

Oracle中分頁查詢語句

oracle分頁查詢語句基本上可以按照本文給出的格式來進行套用。oracle分分頁查詢格式 select from select a.rownum rn from select from table name a where rownum 40 where rn 21 其中最內層的查詢select ...