a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 222|回复: 4

[综合] Oracle综合辅导何时使用绑定变量性能反而差

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
扫描成本和OPTIMIZER_INDEX_COST_ADJ9 X" {( _& f& G: r, i
  我们知道,在CBO模式下,Oracle会计算各个访问路径的代价,采用最小代价的访问路径作为语句的执行计划。而对于索引的访问代价的计算,需要根据一个系统参数OPTIMIZER_INDEX_COST_ADJ来转换为与全表扫描代价等价的一个值。这是什么意思呢?我们先稍微解释一下这个参数:OPTIMIZER_INDEX_COST_ADJ。它的值是一个百分比,默认是100,取值范围是1~10000。当估算索引扫描代价时,会将索引的原始代价值乘以这个百分比,将换算后的值作为与全表扫描代价比较的值。也就是说,当这个值为100时,计算出的索引扫描代价就是它的原始代价: COST_COM = COST_ORG * OPTIMIZER_INDEX_COST_ADJ/1009 N; g, @" r5 Z0 h& H3 [
  看以下例子:0 T8 k& U) E& o
以下是引用片段:
4 s# g, X' `& D  SQL> create table T_PEEKING (a NUMBER, b char(1), c char(2000)); ) d5 T3 w  p4 w3 U; \
  Table created. ; L+ q4 J& C5 z# P8 m! |7 S
  SQL>
9 X; Q9 s4 M  H! E  SQL> create index T_PEEKING_IDX1 on T_PEEKING(b); 1 ?, B. J  ]; V$ Q
  Index created. 9 @/ Z* @  d! M4 Y6 ]& x
  SQL> begin
$ l8 _* v- b: B3 D& I2 K7 y0 c5 E* b  2 for i in 1..1000 loop - n' k6 m, z2 z* K0 L2 ^0 Y2 y2 c8 l
  3 insert into T_PEEKING values (i, 'A', i); * |7 i  @* U6 Z  F) o& L, c: z4 e# D
  4 end loop;
/ Q* f) W4 @& X  ^1 v  5 " W4 P! z' v. S" H: P
  6 insert into T_PEEKING values (1001, 'B', 1001); 9 R- [  _+ q' N$ U5 z
  7 insert into T_PEEKING values (1002, 'B', 1002); " m+ c: t- {* e. _( |
  8 insert into T_PEEKING values (1003, 'C', 1003); / A+ ~5 M- D$ m* p- E' P
  9
8 c& j$ i  D- \. a2 s0 A. o  10 commit; + H% `8 u  i* L. _0 G
  11 end;
- a3 u- \4 H8 }9 S3 c$ f* e6 |% \  12 / 0 [4 C, j* G6 I; ^9 E3 j) n% A0 b
  PL/SQL PRocedure successfully completed.
. ~) E9 q, C' M8 Z
7 _3 g1 \. ]8 k$ o2 }: m1 X7 Z& F" C  注意,我们给索引字段B插入的值中只有3个distinct值,记录数是1003,它的集的势很高(1003/3)=334。
9 r3 L$ u3 G/ ~; n: `! M9 V以下是引用片段:
9 T" v+ S7 Y5 @+ S/ s4 C& q8 ^  SQL> % n, j5 R" \/ b
  SQL> analyze table T_PEEKING compute
) F' g$ P  f/ ]8 i7 P0 E* R  statistics for table for all indexes for all indexed columns;
: c1 k; }* M' \' L0 c  Table analyzed. # H+ l% l, _: H
  SQL>
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:50 | 显示全部楼层

Oracle综合辅导何时使用绑定变量性能反而差

  我们看下索引扫描的代价是多少: SQL> show parameter OPTIMIZER_INDEX_COST_ADJ</p>以下是引用片段:1 W2 @$ U. l1 M
  NAME TYPE VALUE
, u9 N, [* e7 v( u% |: ~* @  ------------------------------------ ----------- ------
6 b' s2 @+ F- J% `- b  optimizer_index_cost_adj integer 100   d5 @7 E6 K# Y9 X6 t  l" _$ i
  SQL> delete from plan_table; * o: \0 W: a, [+ T
  0 rows deleted. : l5 ~9 a& ?4 P4 K* J
  SQL>
: a7 l: p3 N5 d2 i1 C: ?  SQL> explain plan for select
/ l; Z1 e- ?! X5 K# [  /*+index(a T_PEEKING_IDX1)*/ * from T_PEEKING a where b = :V;
& H% r# i0 O7 n; k/ Z8 K+ h9 ~  Explained. 9 x) S7 Q) m$ A1 W0 ~
  SQL> select lpad(' ', 2*(level-1))||Operation||' '||options||' '||
& l; W7 _& Q6 M  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query 5 N: _+ s. }9 @. L' V+ f/ C
  3 Plan_Table"
3 J0 F- Q$ {" D! b, [* |) v  4 from plan_table $ `) a7 m$ X1 W. R$ `; I( i
  5 start with id = 0 & ~6 ~  c1 N+ Z6 d
  6 connect by prior id = parent_id
! B+ |" @& ]5 P4 u  7 ; + D: \0 X1 e8 o. [) R% ~5 ^
  Query # @$ i9 [3 w3 p$ m0 z* y: K
  Plan_Table
5 E  J2 t. z+ A6 f/ n* w( ~  ----------------------------------------------------- 6 T# m" ^  O6 k) z- \: c
  SELECT STATEMENT Cost=113 ; u8 u' u9 @/ O9 T  s, O: a
  TABLE access BY INDEX ROWID T_PEEKING
8 n: i8 \5 d2 Q8 {' O  INDEX RANGE SCAN T_PEEKING_IDX1
0 Y$ j0 N2 Y2 G/ I  SQL> 4 G8 V" D+ V" n$ F

1 \# w$ i: {) Z1 x  _7 B: G' a  再看全表扫描的代价是多少: 以下是引用片段:& A2 N8 e# S3 z+ b- T/ f6 ~
      SQL> delete from plan_table;
, s" X7 b/ f7 K3 m" A# A6 M, V  3 rows deleted. 5 _+ o0 v  d7 R7 h$ J
  SQL> & J( N  R% C9 ]$ f' q1 @
  SQL> explain plan for select " y0 {& I' Q& P% R8 H
  /*+full(a)*/ * from T_PEEKING a where b = :V; $ L5 I+ a) d4 x& H- M$ ]+ t- z
  Explained. ( w/ z3 o) @+ ]: W# M0 _
  SQL> / m3 h4 J1 j; C" \' _8 J
  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '||
% U4 R7 Q) ~/ g7 ]( B! L8 M9 J! x  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query 7 ~) D- }4 `/ N9 P- O( X
  3 Plan_Table" ( h* Y6 L& y! P: X" j
  4 from plan_table
0 w& q! Y5 o2 J, Q$ Z( Z$ K4 H$ l0 W$ l, z  5 start with id = 0
$ u, f' ]5 ?+ z& X+ |, T  6 connect by prior id = parent_id
4 @" d2 M4 x  l% e/ O/ B- @7 o  7 ; $ r. M- T& \9 P- U# i  R
  Query 0 S0 d. A4 h- [; r" J7 N
  Plan_Table ' V+ G  z& X5 Z1 ?$ O, W
  ----------------------------------------------------
- b1 K! C* i0 G8 _7 g; r  SELECT STATEMENT Cost=75
! }* G3 o; f2 a  TABLE ACCESS FULL T_PEEKING # q4 d& M$ W) [' k3 J0 P+ _3 \
  SQL>
  d  U! H) h. n2 @! F4 k& D/ {  u$ z% e2 O5 G
  这时,我们可以计算得出让优化器使用索引(无提示强制)的OPTIMIZER_INDEX_COST_ADJ值应该< ROUND(COST_FTS/COST_IDX*100) = ROUND(75/113*100) = 66,而大于66则会使用全表扫描: SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=67;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:51 | 显示全部楼层

Oracle综合辅导何时使用绑定变量性能反而差

</p>以下是引用片段:
. M' u8 l; R; m* n7 A* a( n  System altered.
/ w. r, `1 i: L" E; `/ I1 P  SQL> 0 H$ O3 ]/ x, y
  SQL> delete from plan_table; # S& I( U/ |+ D- m/ z+ E% `
  2 rows deleted.
$ s0 Q% }2 K) p$ o  SQL> - X) y7 P2 C- \/ {( h, `
  SQL> explain plan for select * from T_PEEKING a where b = :V; * L7 J! O! [5 K/ k5 D6 x
  Explained.
9 s- O' n  `6 H, [7 j& S0 t5 j( h. H  SQL> ' W; |( `* y5 Y% Q$ `; \- F1 L# x
  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '||
( k! g& N, x, A! @  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query
7 ?0 v( X) j( \7 h  3 Plan_Table"
3 P$ p5 b; t+ t1 h* m' G  4 from plan_table
7 X; q; b+ }0 m2 g: u  5 start with id = 0 9 I7 Y# B# s; b  |# T
  6 connect by prior id = parent_id; 6 }% d; y2 M8 ]: V1 q
  Query
* B& i5 k! ^5 u1 K$ A  Plan_Table 2 q% p1 Z+ |+ ^. ~) I1 p' W
  -----------------------------------------------------------------
, O8 U+ {1 D  ?' J# H0 e1 F  SELECT STATEMENT Cost=75 8 [. v1 C8 h; ?
  TABLE ACCESS FULL T_PEEKING ; W+ E0 C7 Q; {, Z5 S) }$ j4 X; i
  SQL> & h. f+ _- R, O
  SQL>
  N& [. S! @, Q$ I$ U; k  SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=66;
% h6 i' _1 D$ K& q* c) ^  System altered.
$ ?7 N- s( @2 p# o- [4 h  SQL> * S, w% {* d. ]9 L& @2 U& l6 N
  SQL> delete from plan_table; 1 n) u2 P" G+ V" c$ l' \
  2 rows deleted. / L, N9 z% ^! f5 S6 @) x8 x
  SQL>
  A2 }: F" v- m2 y1 o* Y) _6 t  SQL> explain plan for select * from T_PEEKING a where b = :V; , Y, O6 L. Y5 f& T* ]$ H& B) B
  Explained.
2 ^4 H& q4 a! u3 O" F% r  SQL>
9 O9 E6 P% {  n7 B  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '||
. ^; \) |% a) ~6 a- J; k  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query
# A$ G9 b' e: w& a/ Q5 L2 O7 b1 d  3 Plan_Table"
, v: f% ?9 Q8 `, s  4 from plan_table % G8 N9 b5 Y% K" h
  5 start with id = 0 + U6 [2 `  Z! k8 o% m7 G: F
  6 connect by prior id = parent_id;
" l4 j- e- E% ]* q' r& x  Query
6 d2 x2 n3 h+ m8 F: a$ h" Y& F  Plan_Table
( J* ?* x! l, M. J; L  --------------------------------------------------------- % n4 W7 h( D$ X4 ^
  SELECT STATEMENT Cost=75 8 z8 o% J  \& q0 ]) J% H
  TABLE ACCESS BY INDEX ROWID T_PEEKING : h0 S# e5 H4 s' q1 Q8 o* ]" X
  INDEX RANGE SCAN T_PEEKING_IDX1 ( n& d" I# n% {% C. n" m

4 j/ G: P8 b' z  可以看出,在使用绑定变量时,参数OPTIMIZER_INDEX_COST_ADJ对于是否选择索引会有重要的影响。0 s! v0 \% v5 M% v9 i9 |  O8 r( X
  这里我们暂且不讨论索引扫描的原始成本是如何计算得出的。但是有一点很重要,在使用绑定变量时,计算出的成本是平均成本。在我们上面的例子中,字段B的值只有3个:"A"、"B"、"C",其中A最多,1003行中有1000行。因此,在索引上扫描值为A记录的成本为1000/1003 * 索引全扫描成本 ≈索引全扫描成本,我们看下它的成本是多少:
1 `0 j1 L8 l& m6 y$ w
8 t# M1 ?9 b& q$ e0 S, Q; U以下是引用片段:
4 j( |& V! A/ v, G  Y. p  SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=100; + z+ z, R& X+ W* M7 i
  System altered.
8 }. ~; }  V7 y; u& F* y  SQL>
3 Y( H# ~; r  a* ?/ Z* x% s  SQL> delete from plan_table; * j  D$ M2 }. U. p- H! R: `( J
  2 rows deleted.
; B) o" O7 x1 v# t; e# V( W6 C  SQL> & {2 U; K4 N! M" V6 Y$ Q
  SQL> explain plan for select   P) c* }% q* u0 m4 P
  /*+index(a T_PEEKING_IDX1)*/* from T_PEEKING a where b = 'A';
6 [* e& k+ A" r' p; `  A  Explained. 2 l# f4 a% l2 g' ~
  SQL>
8 o# O8 L- ?+ B6 @  m  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '||
! V* \; W& D1 Z" P9 e+ n  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query
8 x5 }2 r) `, v4 Y& p, c' q! `  3 Plan_Table" 8 S% v# ?/ \! L: V1 r' Z5 @+ o
  4 from plan_table
! e( L: b. v, t( `& N  5 start with id = 0 9 n4 v: P* C( Q0 K
  6 connect by prior id = parent_id;
& z6 k) w' w& B" |7 c5 z1 a+ T, p  Query * J8 C$ M% z0 y$ H, n
  Plan_Table
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:52 | 显示全部楼层

Oracle综合辅导何时使用绑定变量性能反而差

  --------------------------------------------------------------
8 A* x9 U! k; e# T& f4 \' B  SELECT STATEMENT Cost=336
1 t: t+ }% O% Y; D6 D! d  TABLE ACCESS BY INDEX ROWID T_PEEKING
$ j) S  S; P4 x  INDEX RANGE SCAN T_PEEKING_IDX1 </p>
8 t& y+ l& [6 j/ e3 d  可以看到,它的成本是336。因此索引的平均成本是(336 * 1003/1000) / 3 ≈ 113,也就是使用绑定变量使的成本。而扫描其它两个值"B"和"A"时代价就非常小。 以下是引用片段:
2 J1 i6 B4 c  h# G* P      SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=100;
: m: u/ Z1 D& k( E" d" E' P  System altered. / y# {$ c1 y( q) Z  E- s0 T- X5 K( }
  SQL> 6 P* G( [$ @0 p1 g9 u: K
  SQL> delete from plan_table; & x) _! Y( ~# f  l2 J3 c
  3 rows deleted.
* i: c, z3 N5 m+ Z2 O' [$ n  SQL>
" _  l" d5 ?) H+ X  SQL> explain plan for select
4 _7 R$ S- c9 Z8 A; V  /*+index(a T_PEEKING_IDX1)*/* from T_PEEKING a where b = 'B';
; m" y9 f0 L3 E$ \' s  Explained.
2 u. v8 D6 A5 f  SQL> 5 t0 F2 g- W% h9 w( r- n  M6 T2 y; ?
  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '|| 5 O5 d- L  n/ U. i) E8 h
  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query
2 m0 @: T& p) C& }0 d) q+ a6 h  3 Plan_Table" , y: q6 n3 m* z' V; d8 E; Z
  4 from plan_table 9 y5 W3 Y# s5 x+ g' ^
  5 start with id = 0
0 d6 U' m3 \, E# b0 E  d  6 connect by prior id = parent_id;
9 j  m1 P- @2 V3 X4 n5 W  Query 5 w+ s& @& b/ w3 K8 Y
  Plan_Table
* _  p/ M. E/ \0 g  ---------------------------------------------------------------
% E) K! ]' p5 a- g: t$ w3 ~/ I  SELECT STATEMENT Cost=2
& b: \' ^. U$ V  TABLE ACCESS BY INDEX ROWID T_PEEKING
# F1 g% A5 }- U$ [5 R  n! S- p+ q  INDEX RANGE SCAN T_PEEKING_IDX1 6 w" H' G1 \0 c% A. Y
  因为计算的成本是平均成本(相对实际扫描某个值的成本,平均成本更接近全表扫描成本),因此在创建查询计划时,使用绑定变量将更加容易受到参数OPTIMIZER_INDEX_COST_ADJ影响,特别是上面的这种情况(即索引字段的集的势非常高时)下,平均代价与实际扫描某个值代价相差非常远。这种情况下,OPTIMIZER_INDEX_COST_ADJ对不使用绑定变量查询影响就非常小(因为索引代价不是比全表扫描成本大很多就是小很多),不管扫描哪个值,不使用绑定变量将更加容易选择到合理的查询计划。0 n( Z; {  q, H; V/ ~
  绑定变量窥视3 J4 b; E; K0 R0 v
  在了解了参数OPTIMIZER_INDEX_COST_ADJ的作用后。再了解一个对查询计划,特别是使用绑定变量时会产生重大影响的特性:绑定变量窥视(Bind Variables Peeking)。* N4 v  j/ B( K2 a2 L7 M+ y) h
  绑定变量窥视是9i以后的一个新特性。它使CBO优化器在计算访问代价时,将绑定变量传入的值考虑进去,从而计算出更合理的成本(否则,将会计算平均成本)。看下面例子: 以下是引用片段:
, W" e" \9 U+ C+ C! l+ `: e      SQL> conn sys/sys as sysdba
: V: D! p$ M$ R+ a+ T: ~( R& v4 j9 p  Connected.
" F( C8 o& Y$ G- F  SQL> - {0 Y& F4 A$ n' Y
  SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=60;
5 x; q, o6 s. T# f  System altered.
7 |4 t6 T0 F0 G5 t& }) o& M9 ~, q  SQL> analyze table T_PEEKING compute 2 \' A* u) j2 |* ^* f
  statistics for table for all indexes for all indexed columns;
2 |) f0 O- v8 Q" b' b  Table analyzed. $ q5 t- X, M2 J1 Y+ T
  SQL> 3 C* W: {9 O+ T0 d8 d
  SQL> set autot trace
1 h! {. b8 H/ Y/ x( w  SQL> 6 B) j# ]" h% d6 _
  SQL> alter session set sql_trace = true; / B4 y  ~- n2 ]% q* e0 y7 v) n- E
  Session altered. % a9 E1 {  o$ T% F. k0 B
  SQL> ! a, e* D$ m# I2 T5 v
  SQL> var v char(1) * J$ W% z5 m0 K
  SQL>
" ?( P6 y! ]' @, d" L$ K  SQL> exec :v := 'A'; : e; O% v; B% @7 W; J/ H6 B+ ]5 {
  PL/SQL procedure successfully completed.   J- r+ r4 V, r. `; y
  SQL>
1 |3 ?1 E6 q' }. S* t8 f  SQL> select * from T_PEEKING a where b = :V; # H* d" m6 ?/ n% u
  1000 rows selected. # T3 Q( ^# _! H$ T+ m
  SQL>
2 m2 s  u7 U! o4 ~4 g$ W4 ?+ R  SQL> alter session set sql_trace = false;
# R7 q& E9 N; |1 ]. n! H- O5 d1 P8 ^: L  Session altered.
, p: P6 j2 }7 U2 {; n4 f% a7 s- o; j# ~# h$ _9 T
  用Tkprof处理生成的trace文件。因为在存在绑定变量窥视时,autotrace或者explain plan可能不会显示正确的查询计划,需要Tkprof来处理sql trace。 tkprof fuyuncat_ora_5352.trc aaa.txt
% W  H3 C9 m0 g  此时OPTIMIZER_INDEX_COST_ADJ是60,根据上面的结论,似乎查询计划应该选择扫描索引。但是,这里给绑定变量赋了值"A",这时,优化器会“窥视”到这个值,并且在计算扫描成本时按照这个值的成本来计算。因此,得出的查询计划是全表扫描,而不是扫描索引,靠Tkprof分析的结果: 以下是引用片段:
3 B  @, _  e6 ]% P, y1 Q9 G      select * from T_PEEKING a where b = :V , b) t1 h2 M! k" ?& @8 W1 I# e2 m
  call count cpu elapsed disk query current rows 2 q( E6 W, M+ u! C/ m+ A5 T3 c% c
  ------- ------ -------- ---------- ---------- ---------- ---------- ----------
5 _5 i" o6 r* m: Q1 }+ X  Parse 1 0.00 0.00 0 0 0 0 ( ^/ F6 {( X" @
  Execute 1 0.00 0.00 0 0 0 0 # c# H5 }$ F# @: h2 n6 e
  Fetch 68 0.01 0.07 0 406 0 1000
  g, T% p( [) j, J7 k$ N  ------- ------ -------- ---------- ---------- ---------- ---------- ---------- 1 |( B6 K' Z; W& @; N
  total 70 0.01 0.08 0 406 0 1000
/ G( v# w# O: t5 S& D8 t  Misses in library cache during parse: 1
+ T* G# U$ K+ @; t: l  Optimizer mode: CHOOSE
% \/ l. C9 N' u' r' Z6 K- A! ~" W  Parsing user id: SYS
  Y2 e. V7 s& \3 ~9 l. J  Rows Row Source Operation
' Y  M5 w0 a" f) Z4 l3 l: u  ------- --------------------------------------------------- 0 s5 D$ w  b( k/ U
  1000 TABLE ACCESS FULL T_PEEKING (cr=406 pr=0 pw=0 time=5052 us)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:53 | 显示全部楼层

Oracle综合辅导何时使用绑定变量性能反而差

  但是,绑定变量窥视对一条语句只会使用一次。就是说,在第一次解析语句时,将绑定变量值考虑进去计算成本生成查询计划。以后在执行该语句时都采用这个查询计划,而不再考虑以后绑定变量的值是什么了。 SQL> conn sys/sys as sysdba</p>以下是引用片段:
, Y: v& y, }. s$ M  k& D! \3 a  Connected. 6 @! I! T' ]1 d; w
  SQL>
& s( X7 G1 b7 _! g! K  SQL> + {9 E9 s/ p) H; T0 D# x9 \
  SQL> set autot trace ' y$ I) g, Z( i
  SQL>   {+ ?4 p+ t8 q0 `1 d) G5 I% y
  SQL> alter session set sql_trace = true; 1 P! {/ n2 i2 }" U# E
  Session altered.
5 p$ k* p, s: w0 t9 x  SQL> # m) g: V! |; q) I. v1 C
  SQL> var v char(1) 4 e, S& ~! X; a* {5 X
  SQL>
2 e8 Y  G  X8 r& N0 ^  SQL> exec :v := 'B'; % S+ C, K& w& q$ w
  PL/SQL procedure successfully completed.
7 i+ [( E0 a( e3 D' w: r! \  SQL>
, Z1 ]6 u& F1 M) U; g) k* r3 P. @  SQL> select * from T_PEEKING a where b = :V;
9 T7 @! i( r( Z5 y  P2 V% I. c  1000 rows selected. / u+ f  F( X$ }7 P9 ]
  SQL>
7 \9 Z* J$ a: o+ Y  SQL> alter session set sql_trace = false;
, I' e6 R/ Z! z' p2 }% D' ^  Session altered.
4 u% w4 N$ S: s2 d- Z
9 M$ r* G5 }& \7 f  再用Tkprof分析生成的trace文件,看到尽管这里的值是"B",选择索引扫描会更优,但分析结果中查询计划还是使用全表扫描: select *% T3 E* m' ~, a' |
以下是引用片段:% z( U9 d3 `8 e* b) A
  from % @. s2 F) m  A$ ~6 n) C0 @
  T_PEEKING a where b = :V 4 P) @7 J# x& ^4 s  A( K) ^/ b7 H
  call count cpu elapsed disk query current rows
3 n; |! H; e/ e7 V5 ^' h  ------- ------ -------- ---------- ---------- ---------- ---------- ----------
# l4 p8 V' w% H  Parse 1 0.00 0.00 0 0 0 0
* E( T1 z2 s. j2 f  Execute 1 0.00 0.00 0 0 0 0 + a0 S% W9 z( h" M. H6 Y; L7 W( p
  Fetch 2 0.00 0.00 0 340 0 2
+ j( r; U5 S6 @. v1 _: D5 E( z1 X  ------- ------ -------- ---------- ---------- ---------- ---------- ---------- 4 r: z9 v0 Q+ f+ K
  total 4 0.00 0.00 0 340 0 2
; I0 B: Z' l. ?' o$ P$ `, D7 K) @. f  Misses in library cache during parse: 0 " ]% O+ e* o# b
  Optimizer mode: CHOOSE
( {4 i/ }$ Q# I" I  Parsing user id: SYS
& _5 g! j3 C3 L: y, S1 Y  Rows Row Source Operation * l. H- K" d3 t4 k
  ------- ---------------------------------------------------
  P" B- _- e7 ?; l; h  2 TABLE ACCESS FULL T_PEEKING (cr=340 pr=0 pw=0 time=1005 us)
& i0 R+ r7 q& G/ x- U3 U9 x
) P% M; m9 U7 u  因此,这种情况下使用绑定变量也会导致无法选择最优的查询计划。
8 h& u# H2 k. K% c- N' H( a4 N  综上所述,我们可以得出一个结论:在对建有索引的字段(包括字段集),且字段(集)的集的势非常大时,使用绑定变量可能会导致查询计划错误,因而会使查询效率非常低。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 07:38 , Processed in 0.413035 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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