a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 220|回复: 4

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

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
扫描成本和OPTIMIZER_INDEX_COST_ADJ  t4 m# A* F& T+ q
  我们知道,在CBO模式下,Oracle会计算各个访问路径的代价,采用最小代价的访问路径作为语句的执行计划。而对于索引的访问代价的计算,需要根据一个系统参数OPTIMIZER_INDEX_COST_ADJ来转换为与全表扫描代价等价的一个值。这是什么意思呢?我们先稍微解释一下这个参数:OPTIMIZER_INDEX_COST_ADJ。它的值是一个百分比,默认是100,取值范围是1~10000。当估算索引扫描代价时,会将索引的原始代价值乘以这个百分比,将换算后的值作为与全表扫描代价比较的值。也就是说,当这个值为100时,计算出的索引扫描代价就是它的原始代价: COST_COM = COST_ORG * OPTIMIZER_INDEX_COST_ADJ/100: n7 ?7 z) o( ?4 F, }; [& E
  看以下例子:
2 L2 h+ N$ v/ @4 N4 w/ i% h以下是引用片段:& |2 }8 \$ b. O4 @
  SQL> create table T_PEEKING (a NUMBER, b char(1), c char(2000)); $ L/ I' v7 l2 y/ t+ f/ z. ~
  Table created. 2 ]/ K' {- H( D0 |
  SQL>
7 M7 \" ~- ?. T7 {6 @) f0 k  SQL> create index T_PEEKING_IDX1 on T_PEEKING(b); 2 R* P. M3 U% x# b' ]
  Index created. 7 |# J+ l% x$ e# N9 ~
  SQL> begin , z& A  C! v; o7 h( }7 c8 R
  2 for i in 1..1000 loop 1 P) _$ O2 F* S
  3 insert into T_PEEKING values (i, 'A', i);
( j! D" n# F6 Y) U1 A' H* ^& X  4 end loop;
# w. w' s) V7 ]/ ~+ h5 ?/ E  5 4 h% n+ N5 p3 t4 K' Z- L
  6 insert into T_PEEKING values (1001, 'B', 1001); ; Q. ?- I( T: [/ ~! v- I& v5 M/ ?
  7 insert into T_PEEKING values (1002, 'B', 1002); - A6 W7 k7 D. ?! M& V9 t! G; ~; M
  8 insert into T_PEEKING values (1003, 'C', 1003); 7 d6 d/ T" ^3 m: C5 i5 a: E
  9   ^' L0 S6 W, @$ W7 `
  10 commit; 0 }! l+ ]+ u" t) j5 h' j3 h& d0 @) \4 ~
  11 end; ' w; k  o! r" L4 }  Y6 z- t
  12 / ; M2 ]; @1 y& q8 a; \7 [$ s
  PL/SQL PRocedure successfully completed. 0 s0 k% w3 F0 u, z
9 D+ p$ }: v( @4 n
  注意,我们给索引字段B插入的值中只有3个distinct值,记录数是1003,它的集的势很高(1003/3)=334。: p7 X& M( L' t2 d' ^" P
以下是引用片段:( |4 z& L' x+ z1 p* H2 n
  SQL> 4 E4 ^6 P9 I+ M2 {
  SQL> analyze table T_PEEKING compute 7 m) D. \' F% E2 {5 M' ~- p
  statistics for table for all indexes for all indexed columns;
# `& h; U# j" Q* n- Z  Table analyzed. 8 E+ k8 F# S" W& N
  SQL>
回复

使用道具 举报

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

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

  我们看下索引扫描的代价是多少: SQL> show parameter OPTIMIZER_INDEX_COST_ADJ</p>以下是引用片段:. R6 d. l1 l4 f! F& t2 k. c# ?
  NAME TYPE VALUE % s) [' a* m0 v  R, q# H  H
  ------------------------------------ ----------- ------ + ?5 p' [0 {! g- n: Z& N
  optimizer_index_cost_adj integer 100
4 C5 P5 m$ f" Y  j  [+ [  SQL> delete from plan_table;
+ w0 n- v; ^; k) A8 N0 [% i' x: q0 U  0 rows deleted. + k- m2 {' ]* p
  SQL>
& j* x) F1 @6 p& Z  SQL> explain plan for select : @+ H/ M+ p, {7 n
  /*+index(a T_PEEKING_IDX1)*/ * from T_PEEKING a where b = :V;
3 l% H" a5 }" `. ]4 B+ N. z6 k  Explained. ) {$ p* i7 P# Z8 u2 W
  SQL> select lpad(' ', 2*(level-1))||Operation||' '||options||' '||
: ~$ A7 l6 L( x  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query # }; u" h8 [, b) d. S
  3 Plan_Table"
# m: ?# q; C! ~9 P$ x5 V  4 from plan_table
" K3 w) u& O" i' E0 k9 Q! O3 x$ P  5 start with id = 0
/ X5 o7 V: l4 N6 B  6 connect by prior id = parent_id : f1 j0 m7 Y- ]4 y0 N
  7 ;
! g2 R, F' M( ~6 w- ~: _" Y  Query + G( ~& E  C3 S- }7 i
  Plan_Table
# B8 y/ g+ C; T5 k  -----------------------------------------------------
4 b0 g( |9 E  v+ _9 Z  y  SELECT STATEMENT Cost=113
& I6 s) p3 q- A  ~+ P  TABLE access BY INDEX ROWID T_PEEKING
6 {- E5 H9 w# }1 q3 X- I  INDEX RANGE SCAN T_PEEKING_IDX1
& b4 r6 f. W6 k! N1 O: i  SQL>
( p- m  z; y+ F- q
. @3 S$ \3 E0 T  i. ?. M0 u  再看全表扫描的代价是多少: 以下是引用片段:( y4 I3 C9 E  p: G' b2 G8 c
      SQL> delete from plan_table; ( Y5 ~' y. P3 i& I6 T
  3 rows deleted. & z, b7 Z  A3 b" u
  SQL>
$ f! ?: o+ o8 {$ D' h! Z" O; C# f  SQL> explain plan for select - z5 x9 K3 _/ F5 x7 n
  /*+full(a)*/ * from T_PEEKING a where b = :V;
- [3 h: Y* @( b& }! J/ `* r- }  Explained.
2 s9 `9 J4 T( M' a7 o  SQL> 3 {! A- H  e( S1 I- h6 x' }- _
  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '||
, _# }$ t" q) _; H5 n  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query ' [  v, y+ v$ `3 k2 [
  3 Plan_Table"
. Y4 b0 v& h. P5 X% U/ s% V  4 from plan_table , \% R0 F# w+ K7 h
  5 start with id = 0
2 ^. G8 ^+ x2 J; E/ R9 U7 f  6 connect by prior id = parent_id
4 I5 F. v3 M6 t( w7 y; h) k* {2 `' Y& ?  7 ; * a0 K0 I: T" H% ~
  Query
0 Z% X! D2 c. x; T  Plan_Table
- G& G) O0 @+ m8 A  ---------------------------------------------------- ( W) o* L4 I: ^1 x) O
  SELECT STATEMENT Cost=75
! ~* g* R7 \3 U  B. `  TABLE ACCESS FULL T_PEEKING $ X3 F. p1 @9 X
  SQL> . h- N/ ~1 ^0 M1 ^* A9 B' ~8 _

2 a- S1 a, e+ f0 C8 G! Y  s" @" h  这时,我们可以计算得出让优化器使用索引(无提示强制)的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>以下是引用片段:
5 o3 Q; ^, S* O- f+ _3 X  System altered. ; L8 h) Q# r" _
  SQL> * A& N+ e8 J3 ~
  SQL> delete from plan_table; , D- L3 ~9 X  O
  2 rows deleted. - n% l) ~5 E, F9 w; R! U
  SQL> ! m' j9 `2 m. y+ [' X1 v. N
  SQL> explain plan for select * from T_PEEKING a where b = :V; , T3 L, S2 l3 z7 s
  Explained.
# _& r/ f, A+ Q; o# ^+ C( m  SQL>
8 M$ ?. R. n$ r6 M& U" ?: t  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '||
" Z6 y2 D1 t  Z" `* s( _  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query
7 D" V" V9 [7 R' z! `  3 Plan_Table" 2 U1 n2 ]. c# m( F
  4 from plan_table & ~4 O9 a. M; H
  5 start with id = 0
6 V, V' @( v' V- j7 u4 n: |- a6 [  6 connect by prior id = parent_id;
$ W# l% @- M0 L! `4 K# I) y8 o& n  Query   @3 g# f( u5 r0 @
  Plan_Table
8 t4 ?* Z* i0 f; J0 F' R  -----------------------------------------------------------------
) a% T) s0 |, o5 B/ u- m  SELECT STATEMENT Cost=75
( a' T* k" ^, S, W3 Z  TABLE ACCESS FULL T_PEEKING
: |6 _1 I2 x% \/ B3 {, b6 q  SQL>
  L7 X6 `' ?6 w5 {4 i8 X  SQL> . G" T( C2 }1 G. I
  SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=66;
% o6 K! a+ \! |  System altered. 0 }# F" I* \% B3 U3 ~7 P& [: y
  SQL>
+ I# T" s" |- H  SQL> delete from plan_table;
* ?! e; R+ C9 O& r, q. R0 x  2 rows deleted. % |& T6 }  ^: o* [: v/ I1 c" Q2 c$ A" ^
  SQL>
  N( f2 i6 T, w* |* Q5 V9 A# a% K  SQL> explain plan for select * from T_PEEKING a where b = :V;
& j) t" i5 S8 ^! H2 Q7 Q$ a  Explained.
/ T# E- `% v) z+ P& a0 v6 D" v  SQL>
  K8 \# Y2 a; B; j  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '||
+ R* b4 g/ D$ I  D  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query
& B" U& [4 X. f  r: w( J5 ]  3 Plan_Table"
6 @! r/ K) J! F- e% `  L0 a+ u  4 from plan_table 2 F  i  I6 d+ f/ W* V4 p, [
  5 start with id = 0 " J- |5 r0 u& N$ b2 X: x
  6 connect by prior id = parent_id; : Z# {  H, M3 X. Z; n
  Query 0 e5 ^7 f! a: y2 ~' D
  Plan_Table
9 v4 a# G9 E- J; ]# s5 U: [2 `  --------------------------------------------------------- . H" s* f. f- M# `9 t
  SELECT STATEMENT Cost=75
9 k0 d% C' k7 z, P3 Y' z# x+ [  TABLE ACCESS BY INDEX ROWID T_PEEKING
! K( m5 n- n! t6 r0 f% F  INDEX RANGE SCAN T_PEEKING_IDX1
6 G$ Q6 N2 O6 m/ d4 m4 e& ]" B& q1 _; m6 {, L, _% t
  可以看出,在使用绑定变量时,参数OPTIMIZER_INDEX_COST_ADJ对于是否选择索引会有重要的影响。9 a  y4 d+ R; d/ G: N9 o$ H# z
  这里我们暂且不讨论索引扫描的原始成本是如何计算得出的。但是有一点很重要,在使用绑定变量时,计算出的成本是平均成本。在我们上面的例子中,字段B的值只有3个:"A"、"B"、"C",其中A最多,1003行中有1000行。因此,在索引上扫描值为A记录的成本为1000/1003 * 索引全扫描成本 ≈索引全扫描成本,我们看下它的成本是多少:: c, F! W9 S, Y/ W! F8 k

, z4 E. C2 i7 R( b7 u, g9 X以下是引用片段:6 x9 l* p& A1 k  h# v; o7 P' E% k
  SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=100;
2 M) r  B3 G; X- d: n8 C  System altered.
/ x% I" }' @+ D+ ]5 A* N# o% d+ u  SQL> ! K$ R+ [4 n9 {! m2 a( Q
  SQL> delete from plan_table; ( v5 _7 B4 \0 {' @- N% t
  2 rows deleted. + O( V# L3 c# w& T
  SQL> 5 l* d" P) z# S
  SQL> explain plan for select
! X( E8 C' F8 [  /*+index(a T_PEEKING_IDX1)*/* from T_PEEKING a where b = 'A';
1 _/ n, B' g) a! s  y7 W) L7 S  Explained.
  T. R7 f, c2 U3 I& D2 A  SQL> & i! W$ k6 z4 @. g& q8 a
  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '|| + f  d2 E; t& K6 @" u, ]! w
  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query ; f# R4 R& e, C, F4 ?0 j
  3 Plan_Table" : U3 i. C( c- S) o% {
  4 from plan_table
2 [* Y5 M) _: l/ o  5 start with id = 0
8 q' ?- o9 i, E. H  6 connect by prior id = parent_id;
0 g+ ~1 ?+ f1 S; s" e  Query
( R; m8 m" W( N$ J6 ^8 E  Plan_Table
回复 支持 反对

使用道具 举报

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

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

  -------------------------------------------------------------- 2 ]2 @5 Z8 u7 X
  SELECT STATEMENT Cost=336
; M! o- w) e2 R3 e( t! e  q  TABLE ACCESS BY INDEX ROWID T_PEEKING
( X- _) w0 J; p8 c- B  INDEX RANGE SCAN T_PEEKING_IDX1 </p>
' V& `, n- e+ p( o. C  可以看到,它的成本是336。因此索引的平均成本是(336 * 1003/1000) / 3 ≈ 113,也就是使用绑定变量使的成本。而扫描其它两个值"B"和"A"时代价就非常小。 以下是引用片段:
+ J) F) T( ^) N, _9 |      SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=100;
9 O$ e) A* t( Q1 z5 `: f  System altered.
: X0 y$ ?6 [: {* Y  q$ ^  SQL>
0 V: I: t! K9 z; r6 k* y  SQL> delete from plan_table; 3 A2 s3 ^( G) W4 v
  3 rows deleted. 9 F+ ]. [+ y/ P4 p: M$ x
  SQL>
; v2 L+ }  E9 z  SQL> explain plan for select
2 s6 g" x7 `) z% |( F  /*+index(a T_PEEKING_IDX1)*/* from T_PEEKING a where b = 'B'; 9 X; Q9 K. S- Z8 T
  Explained.
  v! {. B5 {) y* @1 i- c! z  SQL> " ?6 N, m% t: `3 P* T, t& G- C
  SQL> select lpad(' ', 2*(level-1))||operation||' '||options||' '|| , b. Y! R- z# {! o4 F: R. }
  2 object_name||' '||decode(id, 0, 'Cost='||position) "Query
, u" Z2 T7 Y& o( h  3 Plan_Table" " @5 o4 i8 N8 }) ?# h
  4 from plan_table + _5 q, @+ X7 I8 Z
  5 start with id = 0 9 E$ I* t1 `9 l' \/ d
  6 connect by prior id = parent_id;
% n- V. v8 E! U  Query 9 D7 J5 n! I" p# Y8 D
  Plan_Table
: C( i! N5 h/ ], i* u7 v  --------------------------------------------------------------- % G/ J2 I  G, }  e3 o+ C& @
  SELECT STATEMENT Cost=2
  T$ l: V& K* l* k- z  TABLE ACCESS BY INDEX ROWID T_PEEKING 2 b* O4 \1 K  m9 n
  INDEX RANGE SCAN T_PEEKING_IDX1
; [+ Y1 k: v, |; \$ k/ j4 X( o  因为计算的成本是平均成本(相对实际扫描某个值的成本,平均成本更接近全表扫描成本),因此在创建查询计划时,使用绑定变量将更加容易受到参数OPTIMIZER_INDEX_COST_ADJ影响,特别是上面的这种情况(即索引字段的集的势非常高时)下,平均代价与实际扫描某个值代价相差非常远。这种情况下,OPTIMIZER_INDEX_COST_ADJ对不使用绑定变量查询影响就非常小(因为索引代价不是比全表扫描成本大很多就是小很多),不管扫描哪个值,不使用绑定变量将更加容易选择到合理的查询计划。. `( |5 M7 G6 h6 V* n
  绑定变量窥视* \% j( A2 ?% s- m0 Q& X% _
  在了解了参数OPTIMIZER_INDEX_COST_ADJ的作用后。再了解一个对查询计划,特别是使用绑定变量时会产生重大影响的特性:绑定变量窥视(Bind Variables Peeking)。7 h4 F& Y; I  p, a% t1 v+ C* Q
  绑定变量窥视是9i以后的一个新特性。它使CBO优化器在计算访问代价时,将绑定变量传入的值考虑进去,从而计算出更合理的成本(否则,将会计算平均成本)。看下面例子: 以下是引用片段:5 ?! {* `* @" ^1 Y% b7 V2 k. w8 Q: h
      SQL> conn sys/sys as sysdba 2 P- c8 M- N' K4 B+ p7 ?
  Connected.
) U& I* a3 z  E  SQL>
% o$ j8 n" V8 n$ K  SQL> alter system set OPTIMIZER_INDEX_COST_ADJ=60; 6 |) N' I. A4 O4 k. V2 Z
  System altered.   b8 I7 y* Y1 S/ S
  SQL> analyze table T_PEEKING compute
$ Z$ X9 h1 o) \$ ?$ I- ?9 e. c- W+ w  statistics for table for all indexes for all indexed columns; 0 t  t! M- t* x4 N0 N7 {& v8 S
  Table analyzed.
4 p5 g. M# H' r2 ?  SQL>
) a) L" O  q0 M$ ?  SQL> set autot trace
) ^4 j* [6 ~. T. R( ^  SQL> $ F0 \) a6 i& o/ p0 I
  SQL> alter session set sql_trace = true;
! G4 E, u' D. {& u0 ^  Session altered.   v9 j/ s( i/ {. L
  SQL> ! n! M* H8 |& z: }
  SQL> var v char(1)
% X% Y8 Y; ]9 O  Q7 A7 m) P  SQL> 9 H; i3 Q6 k' [- W7 F0 D. i
  SQL> exec :v := 'A';
8 ]2 G, G# [. Q# _6 z  }- c  PL/SQL procedure successfully completed.
, F5 D- e8 ]6 a+ n  SQL>
7 x3 ]+ S2 |8 y& q4 c  u( u  SQL> select * from T_PEEKING a where b = :V; , `* r1 d' w5 m/ s: J/ ?
  1000 rows selected.
0 A4 }) L) Q, G: G* l# B  SQL>
1 g2 Z3 x5 q& N6 ?# i  SQL> alter session set sql_trace = false; " i& f0 {4 h2 p  {' a
  Session altered.
! s' Y/ P, d) Y0 b8 k. C
! F: w; W9 G$ Z0 E3 w5 \9 y  用Tkprof处理生成的trace文件。因为在存在绑定变量窥视时,autotrace或者explain plan可能不会显示正确的查询计划,需要Tkprof来处理sql trace。 tkprof fuyuncat_ora_5352.trc aaa.txt! b" \1 I/ C% @: b0 f' s; N
  此时OPTIMIZER_INDEX_COST_ADJ是60,根据上面的结论,似乎查询计划应该选择扫描索引。但是,这里给绑定变量赋了值"A",这时,优化器会“窥视”到这个值,并且在计算扫描成本时按照这个值的成本来计算。因此,得出的查询计划是全表扫描,而不是扫描索引,靠Tkprof分析的结果: 以下是引用片段:# g# E9 A1 ]. E: S
      select * from T_PEEKING a where b = :V 4 [/ m( S7 Q; M. r
  call count cpu elapsed disk query current rows & d. H  l& t& p" m0 t2 I' b7 E
  ------- ------ -------- ---------- ---------- ---------- ---------- ----------
9 H( z* s0 B: ]  Parse 1 0.00 0.00 0 0 0 0 + K0 y4 A. G/ Z# D5 G
  Execute 1 0.00 0.00 0 0 0 0
6 G7 @$ J. l8 [3 J) i+ G2 i8 g, {  Fetch 68 0.01 0.07 0 406 0 1000 + `- q! U+ Y0 {  u% {
  ------- ------ -------- ---------- ---------- ---------- ---------- ----------
0 `& E! t, o( N  d( B  total 70 0.01 0.08 0 406 0 1000 + t5 w/ D" ^8 m9 q
  Misses in library cache during parse: 1
# \$ ?# \" ^1 O  Optimizer mode: CHOOSE
4 E" @( n/ J8 G; p- @/ _2 v' O& N  Parsing user id: SYS % w3 W. O# E3 |3 P0 ~/ X
  Rows Row Source Operation
$ ?8 y: }, K! h% y  ------- --------------------------------------------------- & c* F, V+ q7 Y0 |9 \7 Z; q9 i6 S
  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>以下是引用片段:: Y2 G! {" D: N# J6 `7 O, [
  Connected.
! n3 H! i8 ?( {/ R+ l. W  SQL> 1 ]2 m; V1 }+ k$ V
  SQL>
" c% L$ `0 o; k  SQL> set autot trace & c4 i: c* ]1 l: K0 M
  SQL> ) s* ]8 D9 I3 V6 c5 k. @
  SQL> alter session set sql_trace = true; ! d. u8 x5 e) j7 h4 [
  Session altered. * b  x% p6 t/ X6 h  o# G$ H% q
  SQL> 0 E, e! y) x" \4 p5 o* {
  SQL> var v char(1)
* a* \& F5 X  C. Z8 b; E  SQL>
/ }. }0 C  N5 S( T4 Q' M3 `  SQL> exec :v := 'B'; . N1 g9 @$ t' @7 ~7 h
  PL/SQL procedure successfully completed.
2 t( x; Q" n- C: I  SQL>
' |: X6 u" F9 S0 s) s- _9 M7 z5 u  SQL> select * from T_PEEKING a where b = :V;
7 D: Y; |2 X& I- k0 Q0 ]1 h6 M1 P$ u  1000 rows selected.
$ J3 l0 R' _( X! r  SQL>   h% n7 n' ?$ z2 U8 I2 |
  SQL> alter session set sql_trace = false;
4 u" @' u9 u' [% a* G+ {  Session altered.
( h  O3 e3 [) {2 G# h" f* j0 L% l: }# Y4 u, C- }- Y) e3 N
  再用Tkprof分析生成的trace文件,看到尽管这里的值是"B",选择索引扫描会更优,但分析结果中查询计划还是使用全表扫描: select *
0 @! U' Q) w2 h& s( d2 }  D8 l: E以下是引用片段:
# m9 q$ s! C5 m* A. N  from ! V2 t" |* z2 z, \! }1 p
  T_PEEKING a where b = :V
* m0 ^0 ]0 m4 Z0 s5 ]  call count cpu elapsed disk query current rows 1 ]6 H& l( d6 z6 j! b. I
  ------- ------ -------- ---------- ---------- ---------- ---------- ----------
$ E: R: N# \! A. d" ?" ~  Parse 1 0.00 0.00 0 0 0 0
) b  o( T0 _% U7 J  Execute 1 0.00 0.00 0 0 0 0
3 y; j- ?' K1 i( i  Fetch 2 0.00 0.00 0 340 0 2
0 G+ |$ p7 ^: s; Z  ------- ------ -------- ---------- ---------- ---------- ---------- ---------- $ c1 A: M  X9 ~$ K( |7 ~0 Q. w% x
  total 4 0.00 0.00 0 340 0 2
9 H) J7 V) i; l# `) o& z  Misses in library cache during parse: 0 & Y6 A  o8 A3 K+ _
  Optimizer mode: CHOOSE ( n, U: P3 ^2 H. S3 d( l' O; F
  Parsing user id: SYS * Z2 V) \  D3 W9 M& X. W
  Rows Row Source Operation
: ^, F3 r9 d6 w+ T! X! u  ------- --------------------------------------------------- , y1 O- z  g& r/ C0 k
  2 TABLE ACCESS FULL T_PEEKING (cr=340 pr=0 pw=0 time=1005 us)
2 {" t3 p$ O8 X& N6 `0 J$ c* x! }* _" [0 L) ~2 B0 F3 H
  因此,这种情况下使用绑定变量也会导致无法选择最优的查询计划。
" X/ R0 w. c* d' W  综上所述,我们可以得出一个结论:在对建有索引的字段(包括字段集),且字段(集)的集的势非常大时,使用绑定变量可能会导致查询计划错误,因而会使查询效率非常低。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 15:59 , Processed in 0.471330 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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