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