a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 181|回复: 1

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
原始未分页查询Sql代码如下:   Sql代码3 V2 J4 _: z* C- h" R- D3 x+ v
  select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX" X( e# a9 _; c" k
  t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 14 L' A* Q  g# Y, @0 t
  order by ID( r; b+ o: B6 A4 G0 Z+ O/ ?
  结果如下:
! b( L- F+ e* m, {8 x9 D  RN    ID      YYB       XM     MC
+ }5 G/ a! L+ n$ f/ j  ---------- ----------------- ----------------------
2 M, |- c5 h. ?' h+ o& }  3     49  某证券总部     管理员 测试
( b6 ^: W* f4 G% z% g  4     96  某证券总部     管理员 持有上港10000股以上( H8 B* U+ J, |  }, M
  5    102 某证券总部     管理员 十年规划0 v8 v& {  g$ u- Z" d' a
  14   105 某证券总部     管理员 开发渠道为上海- H/ \  d* v* g+ b) D, ]- r
  11   106 某证券总部     管理员 万科A  {7 s+ _+ R% `
  12   107 某证券总部     管理员 11- Z) o* \9 Q. n, }# U1 M
  13   108 某证券总部     管理员 今天过生日的客户9 ]" M! l" d$ Z5 n
  2    109 某证券总部     管理员 客户状态正常# q; g. C* R* z4 E$ n8 Q+ L
  6    110 某证券总部     管理员 无交易# R2 J  P/ f: l$ U* d. F
  7    111 某证券总部     管理员 OA
0 v+ g+ p0 A, C- P$ W  U" n( A/ b& S  8    112 某证券总部     管理员 幸运客户
- }2 m- p* x* T- a4 k  9    113 某证券总部     管理员 风险型
+ ]* _: J& T# S6 L6 l  a2 b, i$ b% k  ]  10   114 某证券总部     管理员 tst, h6 w! w2 Z! P' ?: G2 Q7 h
  22   115 白沙网上交易   安昌彪 安客户正常
  o  n, p& U8 v, h! F8 X  1    118 某证券总部     管理员 213- O9 |' _' h+ |7 [
  18   119 某证券总部     管理员 客户号包含1008
. [6 h& B, {6 p, \9 o  17   120 某证券总部     管理员 aaa; F# Z$ y6 G6 n7 K
  19   123 某证券总部     管理员 ssssssss
: P# C6 V. ~, V* ^% _) q1 E/ [3 B  20   124 某证券总部     管理员 www
/ Z9 N+ d# d. ?" W  21   126 某证券总部     管理员 123123
* h% n6 j, d; d( H7 u) R) N2 R+ V  15   127 某证券总部     管理员 1212
; `9 A+ o( [) |2 t/ J; ^# @  16   128 某证券总部     管理员 aaaaaa
0 F9 a) y8 i. {  22 rows selected
, j, w0 m) R4 d9 j! @  最初我使用如下Sql代码查询:
6 t) [- g: }! Z  Sql代码. p0 T/ ~' d5 L+ ~
  select * from (select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC1 y. X0 l6 K* X( [' ]
  from tZDYSX t,tuser u,lborganization o where t.cjr=u.id and u.orgid=o.orgcode and
: ]% R: M( @1 K
2 o  c0 y+ g# l1 l) k9 H  t.gx = 1 order by t.ID )Where rn>10 and rn
回复

使用道具 举报

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

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

</p>  14   105 某证券总部     管理员 开发渠道为上海; f+ Z) k+ T) v, y! M9 Y
  11   106 某证券总部     管理员 万科A* ^, H$ A! t  o% K
  12   107 某证券总部     管理员 11% p, `, ^6 l! f2 X/ \% i& O! Z  ~
  13   108 某证券总部     管理员 今天过生日的客户6 ]8 B1 ^( @- R5 f8 ]' Q
  18   119 某证券总部     管理员 客户号包含10084 e9 V4 q8 y0 w+ N; ]
  17   120 某证券总部     管理员 aaa
6 x8 K  a  ~2 _) M# }  19   123 某证券总部     管理员 ssssssss
( X' z) b: y& E+ S) E$ e" S% i  20   124 某证券总部     管理员 www
/ k  ^8 T" @! m: l3 Y2 N8 k* d  15   127 某证券总部     管理员 1212
7 u$ u8 }  h; T* X: {3 Z  16   128 某证券总部     管理员 aaaaaa
$ Z) \. K3 m! E  10 rows selected9 f. N' l; x# U# i
  从结果看来,有个问题:此语句Sql代码' a7 s& t; B! O8 Z
  order by CJSJ DESC  被执行,但是是在分后的第11到20条记录的结果集中再进行排序,而不是先排序后分页。(本来希望显示ID为112到126,结果变为105到128)
) r( l4 Y# P* W5 a% Y) {  后来变为以下Sql代码查询:! d9 {$ `, |) ^" E2 b
  Sql代码2 n8 v/ @/ o1 O0 O+ p0 I
  SELECT *
* H, `. [& K$ `9 F! K3 [  FROM(' `/ f. A4 A+ }2 J  Q4 S
  SELECT ROWNUM RN,TA.*/ t+ B* I' }3 Y9 Q; h- C3 }8 X
  FROM(3 v4 r5 P6 N& F* z3 `9 x* w5 y; A
  select t.id ID, o.name YYB,u.name XM, t.MC% B  d& N4 n: X3 x+ |' U
  from tZDYSX t,tuser u,lborganization o& C! ~/ y/ l0 N  z, T
  where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID
$ ?0 U$ |8 k9 s7 w6 }1 v  )TA WHERE ROWNUM  10
( G/ ~( Z5 }3 h4 P) i, s; w! q0 b  ~) J$ n  结果如下:
: g# F7 _. B  V, @  B  RN    ID     YYB           XM     MC7 k, m/ l; z. r+ H( V
  ---------- ----------------- -------------------
; v7 j# k6 t/ d% a3 b  11   112 某证券总部     管理员 幸运客户4 y5 t0 _/ w/ A- R# i7 h
  12   113 某证券总部     管理员 风险型
+ z0 Z1 L1 c/ F% P- A2 n* R6 e  13   114 某证券总部     管理员 tst
2 D% e: V  p7 H$ j3 q6 v  14   115 白沙网上交易   安昌彪 安客户正常. C) Z3 T& |" u1 e* m5 s; f
  15   118 某证券总部     管理员 2130 \7 s7 m2 U1 j
  16   119 某证券总部     管理员 客户号包含1008
  z: V/ I  I- O: a& h  17   120 某证券总部     管理员 aaa
9 w* K2 {1 a/ l5 {# w  18   123 某证券总部     管理员 ssssssss7 Y, D* b# b7 _  F2 S) [
  19   124 某证券总部     管理员 www
' R: C4 H# B2 L0 f) Z  20   126 某证券总部     管理员 123123; @( Z+ n- W9 H! A& c4 N* b
  10 rows selected
" g' E7 P' l5 U4 P  看来结果是正确的。! C4 u6 Z2 F% q1 c( y0 i
  总结:第二种方法其中最内层的查询Sql代码& _; \' G  Y% _, D4 M
  Sql代码
( @: p2 y8 X0 q. [" A  select t.id ID, o.name YYB,u.name XM, t.MC
8 ?. n8 K3 E& t+ o  from tZDYSX t,tuser u,lborganization o4 ]6 z* S% J" T  T0 C" x
  where t.cjr=u.id and u.orgid=o.orgcode and t.gx = 1 order by t.ID
2 K( C, _8 {, W- b& Q6 x% I6 C' ]1 J  表示不进行翻页的原始查询语句。ROWNUM  10控制分页查询的每页的范围。# o1 r, }) {6 t) f* ~

) Z4 z% |% r: A* A% O# G, I& I  第二种方法在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 01:52 , Processed in 0.174395 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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