</p> select sum(object_id) from t where id此时执行计划较上一次发生了变化,使用了全表扫描,Rows接近于实际值——>自适应游标共享特性得以体现Plan hash value: 29662335223 z* q6 u* ?" f3 f
---------------------------------------------------------------------------
1 y0 O7 d5 P4 L6 b' v' }- T& j| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |4 N9 c: i7 U. `0 j! L0 T8 t
---------------------------------------------------------------------------
: ~# G! ?6 {7 n$ E2 l5 T. m| 0 | SELECT STATEMENT | | | | 3 (100)| |
9 {5 p/ j k5 U7 Y3 d| 1 | SORT AGGREGATE | | 1 | 8 | | |
1 r3 q/ N* |% A- S& e: X| 2 | TABLE ACCESS FULL| T | 900 | 7200 | 3 (0)| 00:00:01 |
9 L9 N: {. ~" F* Y& R& E---------------------------------------------------------------------------- J6 S" r& T4 W' l4 d8 n
——>自适应游标共享特性的几个值发生了变化,生成了新的子游标,其子游标号为1 SQL> select sql_id,sql_text,child_number,executions,is_bind_sensitive,is_bind_aware,is_shareable 2 from v$sql where sql_text like '%select sum(object_id) from t where%' and sql_text not like '%from v$sql%';, ~; E# c Y7 E6 M
SQL_ID SQL_TEXT CHILD_NUMBER EXECUTIONS I I I/ }& `6 m: |2 Y4 [
------------- --------------------------------------------- ------------ ---------- - - -
- m9 h. x- ?& D# _7qcp6urqh7d2j select sum(object_id) from t where id为变量赋于不同的值
5 D3 ~( o7 C' F5 ^+ O/ k9 i) ? Z SQL> select sum(object_id) from t where id利用新的变量值执行SQL语句8 _7 {# Y* w6 E/ k. j1 {$ }
SUM(OBJECT_ID)
$ _; E& H3 j3 {. p2 E& N--------------
; n3 I+ l% O* F* S2 x _' _$ Q. E 1548431
1 p6 @* a* j7 f% v; r SQL> select sql_id,child_number,executions,is_bind_sensitive,is_bind_aware,is_shareable 2 from v$sql where sql_text like '%select sum(object_id) from t where%' and sql_text not like '%from v$sql%';- Z" j7 Z3 C& D( M4 E
SQL_ID CHILD_NUMBER EXECUTIONS I I I
% \6 |7 b8 p8 \8 f W1 U------------- ------------ ---------- - - -
! W' _3 q u. N/ d+ E; A) X: Z7qcp6urqh7d2j 0 2 Y N Y
% a% L+ W* o5 k& I4 b: S7qcp6urqh7d2j 1 1 Y Y N) s0 q k1 M8 _6 c& s
7qcp6urqh7d2j 2 1 Y Y Y -->生成了新的子游标号为2+ U& q/ n. I3 s( c7 g8 f
SQL> exec :v_id:=500; ——>为变量赋于新值
$ [ l1 @) X" l y8 _ SQL> select sum(object_id) from t where id利用新的变量值执行SQL语句2 N& i# y! [( y) f' B
SUM(OBJECT_ID)
' O, ?! A3 _; B5 h--------------" h! [2 ]( k$ G5 F+ N) ]
826694
5 S6 i$ o0 x& }2 R7 P/************************************************* */7 o4 [$ b9 {3 `7 Q
/* Author: Robinson Cheng */
, h& j$ P7 |. \7 n/* Blog: http://blog.csdn.net/robinson_0612 */3 K3 |2 _$ `3 w* i" G3 Y
/* MSN: robinson_0612@hotmail.com */" t# T" y4 r9 q
/* QQ: 645746311 */% ^3 h$ `% `' _* V9 W
/**************************************************/
0 X) m/ C+ s3 o( @; {SQL_ID CHILD_NUMBER EXECUTIONS I I I4 Y. f9 Y1 r" Z) T( V' u: ^& W
------------- ------------ ---------- - - -* b4 C7 k" P' w0 |7 ^ X
7qcp6urqh7d2j 0 2 Y N Y( d, T2 O7 O/ E5 Q+ {
7qcp6urqh7d2j 1 1 Y Y N
/ x) R) r2 G8 J6 ]! ^7qcp6urqh7d2j 2 1 Y Y N -->注意看子游标1,2的is_shareable值为N,表示不可共享# |8 d e. |3 a' ]' H
7qcp6urqh7d2j 3 1 Y Y Y -->生成了新的子游标号为3,* ?1 n- y: ]5 `4 Q4 ^
-->查看最终该SQL语句的不同子游标的所有执行计划3 w- N# a* k3 h- C: M, Y
SQL> select * from table(dbms_xplan.display_cursor('7qcp6urqh7d2j',null,'typical -predicate'));
3 j5 b5 W3 y' ]# m6 _+ { W* X. APLAN_TABLE_OUTPUT
7 U9 W* x4 X8 B8 p# h) y: d2 r------------------------------------------------------------------------------------------------------------------. G2 _) m6 z3 n( J3 R
SQL_ID 7qcp6urqh7d2j, child number 00 P8 v4 k" @3 x3 E2 c- U+ h& f
-------------------------------------; x( C2 N) I* Z: U+ o$ o
select sum(object_id) from t where id0号子游标为索引范围扫描" @; |, h/ W7 w7 `+ z3 L
Plan hash value: 4270555908
' |2 W* [, l) Z9 Q7 L8 @! V& U-------------------------------------------------------------------------------------
% d0 k- z6 ^' z+ h| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |& u( N4 m* R' l/ o k
-------------------------------------------------------------------------------------
9 C Z9 J n5 [, b! h# _8 ~| 0 | SELECT STATEMENT | | | | 3 (100)| |+ F% E9 m# [. n; M
| 1 | SORT AGGREGATE | | 1 | 8 | | |6 f! i4 r4 }1 s( u$ M) E% W
| 2 | TABLE ACCESS BY INDEX ROWID| T | 8 | 64 | 3 (0)| 00:00:01 |8 b4 x& T& a0 I# k; V W4 k
| 3 | INDEX RANGE SCAN | T_PK | 8 | | 2 (0)| 00:00:01 |9 `" e& |. a% [* y |3 X' T9 d* T+ n
-------------------------------------------------------------------------------------
6 [0 s! u% l5 d( v6 k6 ?; {8 a p9 NSQL_ID 7qcp6urqh7d2j, child number 1
: [. P5 E7 T1 @3 l1 }$ s4 @-------------------------------------
M" ?- Q. f- w+ pselect sum(object_id) from t where id1号子游标为全表扫描,其预估的行数接近实际影响行数的值为9002 T$ ?! P. c1 f) G* w/ L
Plan hash value: 2966233522
% p' o" R; f+ L" V2 y1 z" p---------------------------------------------------------------------------, ~4 {3 m; E D% u" D5 {0 L
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
7 c* |- o8 K L I8 t---------------------------------------------------------------------------) r' j: `% ?+ q9 |3 d
| 0 | SELECT STATEMENT | | | | 3 (100)| |# _) R) U/ L% N- Z; Q6 l7 b6 A
| 1 | SORT AGGREGATE | | 1 | 8 | | |. t* ^2 o" m3 s* g* z' ]
| 2 | TABLE ACCESS FULL| T | 900 | 7200 | 3 (0)| 00:00:01 |! H9 J8 \! W. k# L/ H' d- n/ V+ j
---------------------------------------------------------------------------
7 V) l- F T! H; \ P' YSQL_ID 7qcp6urqh7d2j, child number 2
7 j5 O" p \5 ~( `2 J* D7 Z-------------------------------------+ u' M* u- G6 E" ] v0 A& W
select sum(object_id) from t where id2号子游标为全表扫描,但其预估的行数接近实际影响行数的值为8005 a& ?& n+ w: \; D T9 q& c3 E/ l
Plan hash value: 2966233522
4 p( t, D d8 ~0 `8 C---------------------------------------------------------------------------
/ Y" c: a# p& b% A| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |0 A; |, f2 P$ N. V, C# z; c
---------------------------------------------------------------------------, s: H' z0 F9 L/ M
| 0 | SELECT STATEMENT | | | | 3 (100)| |
$ {4 L* D/ n; L0 l| 1 | SORT AGGREGATE | | 1 | 8 | | |: X% C0 g+ Q5 u: k1 [ ?8 w
| 2 | TABLE ACCESS FULL| T | 800 | 6400 | 3 (0)| 00:00:01 |4 p6 Q2 W. m! r+ }. K0 f% m# p; _
---------------------------------------------------------------------------; Y5 }" L; m: o
SQL_ID 7qcp6urqh7d2j, child number 3* n+ n! l' A# ?
-------------------------------------
5 o% ^+ o/ B$ h* b9 ]) \/ Iselect sum(object_id) from t where id3号子游标为全表扫描,但其预估的行数等于实际影响行数的值499
, c: c0 M3 @5 D8 O* C# @- s5 Y0 VPlan hash value: 2966233522. y R% v/ N* H% B
---------------------------------------------------------------------------
5 {3 q" o% Q5 {$ p3 M( o, F| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
9 N# a, Y% L6 v) T5 J0 N/ R---------------------------------------------------------------------------; ~- _/ x- C/ o
| 0 | SELECT STATEMENT | | | | 3 (100)| |
3 `9 u5 m- E, L- c& _| 1 | SORT AGGREGATE | | 1 | 8 | | |+ ~3 Z4 U* c3 ~* ]/ e) K1 t
| 2 | TABLE ACCESS FULL| T | 499 | 3992 | 3 (0)| 00:00:01 |
6 K8 U1 B; v! L& R0 e) V---------------------------------------------------------------------------& g: M2 e5 S$ X3 j: D
二、自适应游标共享的几个相关视图
' B3 b7 J6 v4 B- Y/ K* o 1、v$sql_cs_statistics/ }1 W$ o- d" O, | V6 |, ]4 m' E
用于监控自适应游标共享的相关统计信息.下面的查询中列出了每个子游标的peeking情况,以及执行次数,预处理行数,BUFFER_GETS等
: N8 r; w- q. Y: @9 GSQL> select child_number,bind_set_hash_value,peeked,executions,rows_processed,buffer_gets
7 J4 z- N3 V2 b; f 2 from v$sql_cs_statistics where sql_id='7qcp6urqh7d2j'' K0 c8 m4 ?" j: n! }) E/ F. j0 b: s6 G
3 order by 1;% b, C+ m# }/ { ^8 e: j) i0 R
CHILD_NUMBER BIND_SET_HASH_VALUE P EXECUTIONS ROWS_PROCESSED BUFFER_GETS
1 B- Z/ @+ h) q------------ ------------------- - ---------- -------------- -----------
& @0 ]* |: F/ S8 Y+ q 0 1706589901 Y 1 17 69 -->17行,索引范围扫描8 M% p. {0 [( C& {. [% m3 ^
1 3116944019 Y 1 900 5 -->900行,全表扫描: s* B+ \8 h6 O5 c8 q4 V
2 1328865654 Y 1 800 5 -->800行,全表扫描4 [8 f: u. W+ d
3 1624350242 Y 1 500 5 -->500行,全表扫描" y- W0 a8 ]- s
2、v$sql_cs_selectivity
, d" z6 G, x$ a4 W" B 显示每个子游标的游标的选择性范围。下面的查询中列出了谓词,选择性范围,列上的选择性的值% _3 n2 Z. w, ~) W
SQL> select child_number,predicate,range_id,low,high from v$sql_cs_selectivity' ]& W* \8 w+ N' r. N; t
2 where sql_id='7qcp6urqh7d2j' order by 1;
4 s( z4 x9 z7 w3 b" l& l) F- r' D+ R# m# r8 k# Y
CHILD_NUMBER PREDICATE RANGE_ID LOW HIGH$ q- K- A, r J- {' ^ K5 a
------------ ------------------ ---------- ---------- ----------% ]6 _+ K/ J9 S
1 |