a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 184|回复: 1

[考试辅导] Oracle技术:Oracle排序后分页查询与效率问题详解

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
原始未分页查询Sql代码如下:   Sql代码
, x& v/ L% T. U; @) X8 t9 O  select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX
+ S: O; Z3 |! [, Y" j( L  t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 13 n0 i& }& `  M( ^
  order by ID$ Y) ?- T5 e7 v: e
  结果如下:. e' N% A" q+ s% S
  RN    ID      YYB       XM     MC
6 V4 h% O+ Y. a  ---------- ----------------- ----------------------
( n# Z' x& ]$ L7 q  X) e  3     49  某证券总部     管理员 测试
" L0 Z  E' c( U5 Y  4     96  某证券总部     管理员 持有上港10000股以上
! ^4 x% _3 t( U$ b& `  5    102 某证券总部     管理员 十年规划
4 l0 x- {# c4 c$ M/ _2 F  14   105 某证券总部     管理员 开发渠道为上海. c4 g, J$ F$ Q% L
  11   106 某证券总部     管理员 万科A) E: s* R+ X' R6 ]$ ~" B) k' p. L
  12   107 某证券总部     管理员 11, ]* `0 C! O% a+ B5 d7 J
  13   108 某证券总部     管理员 今天过生日的客户
1 _# r  l6 Q: f$ \5 z, S" O6 C  2    109 某证券总部     管理员 客户状态正常
& C$ f7 Z+ x6 q) H) {6 x4 k: I1 T  6    110 某证券总部     管理员 无交易
: |+ C* V$ r: e6 o) P  7    111 某证券总部     管理员 OA
' ^. O! i7 c+ b+ r  8    112 某证券总部     管理员 幸运客户5 M1 p; v; A9 l/ b5 @4 D
  9    113 某证券总部     管理员 风险型
; ?  M: P3 N( g+ o& z  c, a  10   114 某证券总部     管理员 tst. m- y) o, l* z1 @1 I0 m$ G
  22   115 白沙网上交易   安昌彪 安客户正常
, ~6 G9 o8 ~; Q  1    118 某证券总部     管理员 2133 J  i1 ^$ }% m$ ~
  18   119 某证券总部     管理员 客户号包含10089 y* m" }4 u6 t# q& ^+ w3 a
  17   120 某证券总部     管理员 aaa2 f, q+ r9 Q! ~
  19   123 某证券总部     管理员 ssssssss9 @+ \9 h; w: z0 s+ U* }, f1 S2 x
  20   124 某证券总部     管理员 www! _' s3 c& p; Z. Y" U
  21   126 某证券总部     管理员 123123; O" ^  c  R5 M: P: G
  15   127 某证券总部     管理员 1212
5 k* e3 S) n' c  W+ j  16   128 某证券总部     管理员 aaaaaa
! a) K7 \& t7 O. ~  22 rows selected
9 P8 T" W& P& \) ?  最初我使用如下Sql代码查询:
, W! b* B( B0 p  Sql代码/ `2 Z% @5 \4 w# m6 p
  select * from (select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC
, y: ?. `* R% S8 d. @8 W0 P  from tZDYSX t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and/ p$ }/ s/ @! y- A8 H# @' @
4 o8 x) f" m& t' I# @* h( A+ {
  t.gx = 1 order by t.ID )Where rn>10 and rn
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle技术:Oracle排序后分页查询与效率问题详解

</p>  14   105 某证券总部     管理员 开发渠道为上海
* n9 A6 U- X. m8 l9 p5 D: V  11   106 某证券总部     管理员 万科A
1 z/ ]6 Z+ }2 v6 l& b! Q. o. x! n  12   107 某证券总部     管理员 11& H5 B$ [: z- T' s8 |) c
  13   108 某证券总部     管理员 今天过生日的客户
0 }; b2 s2 p2 i- j' D. E  18   119 某证券总部     管理员 客户号包含10086 V# s" p8 P+ ^1 x$ ~% y; S. w$ O
  17   120 某证券总部     管理员 aaa
1 H( Q5 j! ~4 g8 k# A  19   123 某证券总部     管理员 ssssssss
* j! b5 ^9 L0 t  20   124 某证券总部     管理员 www+ Y- [, j0 @! k+ Z6 l# q8 \
  15   127 某证券总部     管理员 1212% z+ D" T) }8 d9 \$ k
  16   128 某证券总部     管理员 aaaaaa8 w( g. C5 f6 b
  10 rows selected8 r2 u! Y# s) x. B5 _
  从结果看来,有个问题:此语句Sql代码
7 [4 e  c+ ^8 b5 I  o. l  order by CJSJ DESC  被执行,但是是在分后的第11到20条记录的结果集中再进行排序,而不是先排序后分页。(本来希望显示ID为112到126,结果变为105到128)
* R1 Z9 j8 u, y9 Q* ]  后来变为以下Sql代码查询:3 X  X  V. \: H$ f0 P
  Sql代码! `7 i6 f4 E% L9 d
  SELECT *
. w  m/ V0 J1 J' C  FROM(& D' u4 ]8 H1 R, a+ |6 Z# [. ]  z9 t6 Y
  SELECT ROWNUM RN,TA.*
( Z5 ?( i( `2 r+ z9 U  FROM(
/ o% {1 m9 k: ]6 X4 j/ B, w  select t.id ID, o.name YYB,u.name XM, t.MC
% |& w5 B& o& ~  from tZDYSX t,tuser u,lborganization o
- q# ~# O9 e+ Y7 h  where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID
+ l) f/ ^  d9 m6 B; M  )TA WHERE ROWNUM  10
$ ]9 }& i' c  o4 g+ A+ j; G% h9 i* ^  结果如下:( x( s/ x2 O+ u5 p
  RN    ID     YYB           XM     MC# ?9 }$ a* h/ G) f4 _- j, D! x; T$ P% a
  ---------- ----------------- -------------------" V3 c/ s) D9 g, c: _9 k
  11   112 某证券总部     管理员 幸运客户
% g. r% `( A: @" ]) C  12   113 某证券总部     管理员 风险型* a7 f4 V9 m0 I
  13   114 某证券总部     管理员 tst
5 T! o2 n' d" a+ H5 E; x  14   115 白沙网上交易   安昌彪 安客户正常
) \9 Z/ s0 ?7 a  _" z4 z  15   118 某证券总部     管理员 213
! v8 @5 u( Y7 \  16   119 某证券总部     管理员 客户号包含10083 Y+ N) ~; l. V4 |
  17   120 某证券总部     管理员 aaa
3 h5 @8 z) e# H# L2 s! I  18   123 某证券总部     管理员 ssssssss
, X4 {1 M; X8 x& u) ?2 W  19   124 某证券总部     管理员 www
7 b( Y7 U9 g* a& K1 H4 o  20   126 某证券总部     管理员 1231237 {& X2 K9 B9 j/ g" N) J1 C. K% J
  10 rows selected9 ^" n- W% V# ?5 y
  看来结果是正确的。
' u# ~! N/ @2 a+ H/ O  总结:第二种方法其中最内层的查询Sql代码
+ F" f5 }- x& V; ^* G  Sql代码
1 k% `; K3 N2 ~2 \! f  R# }1 w' m" ?  select t.id ID, o.name YYB,u.name XM, t.MC" G( S. b5 Q! K9 I# z7 j
  from tZDYSX t,tuser u,lborganization o
+ Y$ d% H% I2 `" _  where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID
4 D: o6 }9 Q* o0 k, o# e  表示不进行翻页的原始查询语句。ROWNUM  10控制分页查询的每页的范围。
9 l& L" _7 k0 s5 {1 j
9 _: d& N. M5 `4 V% N; y  第二种方法在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-18 23:50 , Processed in 0.292541 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表