</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 |