a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 116|回复: 1

[考试辅导] Oracle自适应共享游标

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
 自适应游标共享Adaptive Cursor Sharing或扩展的游标共享(Extended Cursor Sharing)是Oracle 11g的新特性之一,主要用于解决以前版本中由于绑定变量窥探导致SQL语句无法获得最佳执行计划的缺陷,即能够对效率低下的游标(子游标)进行自动识别而选择最佳的执行计划。本文详细描述了自适应游标共享并给出示例。   有关绑定变量窥探请参考:Oracle 绑定变量窥探一、示例自适应游标共享1、创建演示环境view plain SQL> select * from v$version where rownum create table t(id,owner,object_id) as 2  select rownum,owner,object_id from all_objects where rownum alter table t add constraint t_pk primary key(id);0 s4 F) @3 t5 U, o3 y  e5 T, F
  SQL> exec dbms_stats.gather_table_stats('SCOTT','T',cascade=>true);
7 v3 w. Y% l/ o8 H! O- @6 @  SQL> select count(id),count(distinct id),min(id),max(id) from t;+ J2 k1 d) t: [: y# W4 h
  COUNT(ID) COUNT(DISTINCTID)    MIN(ID)    MAX(ID)# T3 v6 I; F/ h" O& {4 L0 V
---------- ----------------- ---------- ----------$ j! V/ j, y- u" B
  1000              1000          1       1000
6 f2 W$ d0 k1 m, t6 z! }7 Z# [       2、使用绑定变量执行SQL语句并获得首次执行情况view plain SQL> var v_id number;SQL> exec :v_id:=9;SQL> set linesize 180 SQL> select sum(object_id) from t where id select * from table(dbms_xplan.display_cursor(null,null,'typical -predicate'));SQL_ID  7qcp6urqh7d2j, child number 0
$ [; {4 C  S  u, w( t$ ]! A: X-------------------------------------
0 |+ r  m- T- I1 R) z* }* R  select sum(object_id) from t where id变量值为9时,使用了正确的执行计划,且预估的行数也准确/ r" ~% \- [. w0 f+ j
  Plan hash value: 4270555908+ y6 T8 V" M$ E0 C7 A4 v
-------------------------------------------------------------------------------------
* o, v5 L9 r; a6 R| Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time |
5 Y; W8 q% s. x! \-------------------------------------------------------------------------------------$ o5 t" R. t" [$ H7 u* A: Q
|   0 | SELECT STATEMENT         |    |      |       |     3 (100)|       |7 y$ G* N; Q0 I+ u& R4 O) g
|   1 |  SORT AGGREGATE            |   |   1 |     8 |           |       |
1 Y: {( z1 x! d8 {% F|   2 |   TABLE ACCESS BY INDEX ROWID| T    |     8 |    64 |     3   (0)| 00:00:01 |7 c  d7 i( p& i% B# t
|   3 |    INDEX RANGE SCAN          | T_PK |     8 |       |     2   (0)| 00:00:01 |
, G1 f5 t7 O+ W( ~2 O-------------------------------------------------------------------------------------
; I1 q9 C% J2 ~7 w: U% x. h6 A; f3 t  i
  SQL> col SQL_TEXT format a45    ——>下面的语句获得自适应游标共享的3个字段值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%';! c7 ~. g- V. E% q  B' a
  SQL_ID        SQL_TEXT                                      CHILD_NUMBER EXECUTIONS I I I
$ |* q0 e8 i, a------------- --------------------------------------------- ------------ ---------- - - -6 }7 V2 s2 y* X3 S
  7qcp6urqh7d2j select sum(object_id) from t where id exec :v_id:=900;SQL> select sum(object_id) from t where id select * from table(dbms_xplan.display_cursor(null,null,'typical -predicate'));5 l6 O/ j2 A* W  ~% g5 V- w' o
  SQL_ID  7qcp6urqh7d2j, child number 0; s2 _0 x2 Z4 Z- w7 P
-------------------------------------' Y. {3 F1 P1 H- F9 }( }% G0 Q
  select sum(object_id) from t where id此次执行的变量值为900,执行计划位上次变量为9的执行计划——>此时为非正确的执行计划,等同于Oracle 9i,10g中的情形Plan hash value: 4270555908* c- x/ }9 K; ]0 x0 T9 Y
-------------------------------------------------------------------------------------! `9 {+ W* ]6 ^5 f2 b1 k2 \& `
  | Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time     |1 _- V" f( M1 n+ M' H+ @
-------------------------------------------------------------------------------------
) w# E4 j! |4 R/ N7 V8 D-------------------------------------------------------------------------------------! n+ E6 U. X1 F4 ?
| Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time     |7 @2 D* j# Q" Q; g9 Q' f  T
-------------------------------------------------------------------------------------; F0 I. D" f! r. k  K5 {% g/ G
|   0 | SELECT STATEMENT             |      |       |       |     3 (100)|          |6 Q9 T1 ]5 T! z1 k8 e5 ^
|   1 |  SORT AGGREGATE              |      |     1 |     8 |            |          |
2 X. o/ P  G- N3 I2 A) l|   2 |   TABLE ACCESS BY INDEX ROWID| T    |     8 |    64 |     3   (0)| 00:00:01 |: y1 Y( v& q9 Z+ h3 |( o7 E( O
|   3 |    INDEX RANGE SCAN          | T_PK |     8 |       |     2   (0)| 00:00:01 |
1 l1 {0 g% h1 P- U% z-------------------------------------------------------------------------------------
7 N+ J7 A/ Q. e-------------------------------------------------------------------------------------
* H( ]. j8 g$ ^. C) x) ^  ——>自适应游标共享的3个字段值并未发生任何变化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%';
0 M: M* `* ?) A/ y4 i, ~9 ?  SQL_ID        SQL_TEXT                                      CHILD_NUMBER EXECUTIONS I I I  x# o8 {9 G% |4 W8 ^' [9 U
------------- --------------------------------------------- ------------ ---------- - - -# B! U+ Q* d& v; A- L/ E
  7qcp6urqh7d2j select sum(object_id) from t where id select sum(object_id) from t where id再次执行变量为900值的SQL语句5 o! y" ?& Z7 R3 j( h
  SUM(OBJECT_ID)
% G- c1 |+ ~* [! W  O--------------
8 ?3 M: V, N$ s% p& J5 V2 V  18265611 i$ J- A" _( Z' }) W
  SQL> select * from table(dbms_xplan.display_cursor(null,null,'typical -predicate'));
9 c# X$ }/ a+ B$ {& E! N( Z* l  SQL_ID  7qcp6urqh7d2j, child number 1
; ^7 _( Z+ W* l+ ~7 C3 u. C- b( G1 N7 m& z% B6 v2 |
-------------------------------------
回复

使用道具 举报

 楼主| 发表于 2012-8-4 14:06:20 | 显示全部楼层

Oracle自适应共享游标

</p>  select sum(object_id) from t where id此时执行计划较上一次发生了变化,使用了全表扫描,Rows接近于实际值——>自适应游标共享特性得以体现Plan hash value: 2966233522
* V6 D1 d( {0 J7 A' _! W& A; R---------------------------------------------------------------------------( }/ d& q, [( T" V2 Q: l2 K
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |& ~! V1 Y3 J5 C4 G; u+ P
---------------------------------------------------------------------------
* {; J$ u  |  e6 Y0 j! G! h|   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |. s5 C* Y- G* y3 ~3 N+ R
|   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |
8 c; X* x' E/ F6 c7 |4 u|   2 |   TABLE ACCESS FULL| T    |   900 |  7200 |     3   (0)| 00:00:01 |' Y- |- N3 o5 A# m* C1 @1 T- X1 M7 Q% J
---------------------------------------------------------------------------) i# H- }6 q: |6 f% Q3 p6 A" I
  ——>自适应游标共享特性的几个值发生了变化,生成了新的子游标,其子游标号为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%';
$ V; c2 A- Z. oSQL_ID        SQL_TEXT                                      CHILD_NUMBER EXECUTIONS I I I
+ D3 M$ O7 q! J4 h% F9 N' B------------- --------------------------------------------- ------------ ---------- - - -2 l' e2 @" J- s7 P, L- `
7qcp6urqh7d2j select sum(object_id) from t where id为变量赋于不同的值0 N; T! q% x% x2 l
  SQL> select sum(object_id) from t where id利用新的变量值执行SQL语句
2 \$ k& J9 e) Y/ r  SUM(OBJECT_ID)
( Q' h6 h. {- q4 Y9 g1 Z; W3 e--------------9 c4 h. |; \, P) p5 E9 W
  1548431$ X1 h9 V3 C- _# v+ ^' J
  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%';
) M' ~' u2 @, I7 h  SQL_ID        CHILD_NUMBER EXECUTIONS I I I
8 {( d0 @! K' ?7 F------------- ------------ ---------- - - -) H* r$ x9 U' g3 q. r* N
7qcp6urqh7d2j            0          2 Y N Y
8 o1 G  b8 k& Z* F& k7qcp6urqh7d2j            1          1 Y Y N
7 o0 C6 g0 B& r$ ^; q" \, W+ h3 f7qcp6urqh7d2j            2          1 Y Y Y    -->生成了新的子游标号为2
" Y0 v0 }! u& ?  SQL> exec :v_id:=500;     ——>为变量赋于新值
% i  G# Z7 `& d& _$ {  SQL> select sum(object_id) from t where id利用新的变量值执行SQL语句
+ Q) y8 M/ Q  m2 q! y  Z# Q  SUM(OBJECT_ID)( k" z7 X6 x8 m# x
--------------
' Y' p" G2 V4 Q5 w  826694; r4 |5 w; A% ^5 I; k
/*************************************************     */
1 h7 K% a& x2 [5 R, U- Y/* Author: Robinson Cheng                                                           */
* n; |# A( h3 P8 p8 v# L. {/* Blog:   http://blog.csdn.net/robinson_0612                               */5 f$ L+ V+ M( y0 Y5 x6 V, B; V/ J
/* MSN:    robinson_0612@hotmail.com                                    */
$ E( k6 t$ ~1 p8 {  Z+ a0 r4 O/* QQ:     645746311                                                                  */  u& @, M$ T1 r* E
/**************************************************/5 P+ ?0 G9 _+ I6 _9 w
SQL_ID        CHILD_NUMBER EXECUTIONS I I I
. x  ?) i0 v3 A4 B0 f; _------------- ------------ ---------- - - -
1 V6 C9 i) S  t# Z+ G7qcp6urqh7d2j            0          2 Y N Y
' O5 R# i5 f( n' V. D0 D2 P7qcp6urqh7d2j            1          1 Y Y N( [( I+ G' W& q: m2 g+ @3 w
7qcp6urqh7d2j            2          1 Y Y N       -->注意看子游标1,2的is_shareable值为N,表示不可共享" ~" d$ V. `9 y3 d" E; ^
7qcp6urqh7d2j            3          1 Y Y Y       -->生成了新的子游标号为3,
7 h0 |: v( m9 C6 P2 O% ~8 O& M5 e1 B-->查看最终该SQL语句的不同子游标的所有执行计划0 N  g/ }: F, m: j: m
SQL> select * from table(dbms_xplan.display_cursor('7qcp6urqh7d2j',null,'typical -predicate'));, C1 r/ u- h- I" y  J3 H+ U
PLAN_TABLE_OUTPUT
+ Z+ h; {4 y) M4 m6 P6 |8 e7 y8 b------------------------------------------------------------------------------------------------------------------
& D+ z" G  Y, T# w, ^3 u" ASQL_ID  7qcp6urqh7d2j, child number 0
2 ]' Z4 d; l* h7 X# ^5 E5 B-------------------------------------
" ]7 B! j8 a- r. E7 Q" v$ G) [4 c' aselect sum(object_id) from t where id0号子游标为索引范围扫描0 G! d& Y- z6 Z# I( D
Plan hash value: 4270555908
4 |8 F- e6 F/ S7 q& t" t-------------------------------------------------------------------------------------
1 d( K  x; z4 o" E0 H  U6 z& l| Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time     |+ F* C7 v1 p  t* j( ?% ^1 H7 e
-------------------------------------------------------------------------------------
! z/ S. _* }! e% A: z|   0 | SELECT STATEMENT             |      |       |       |     3 (100)|          |# j0 i$ D+ V+ ^) \1 `
|   1 |  SORT AGGREGATE              |      |     1 |     8 |            |          |2 Q, S  D' v! p  M- l6 r) k) r
|   2 |   TABLE ACCESS BY INDEX ROWID| T    |     8 |    64 |     3   (0)| 00:00:01 |
+ t8 o1 a6 w6 C|   3 |    INDEX RANGE SCAN          | T_PK |     8 |       |     2   (0)| 00:00:01 |
1 N0 L+ G4 J! p8 a5 n-------------------------------------------------------------------------------------4 |) n6 B& F$ Y: H
SQL_ID  7qcp6urqh7d2j, child number 1
. g7 F8 R& l3 M$ @; q-------------------------------------
$ J2 G! k) @) \' w( uselect sum(object_id) from t where id1号子游标为全表扫描,其预估的行数接近实际影响行数的值为900( O. Y+ O+ Z7 ]* T- o
Plan hash value: 2966233522
6 \+ b8 O# x7 c+ z1 j3 N---------------------------------------------------------------------------
; O1 C- t) B8 @( d. J# o$ R| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
6 _( k: n) Q+ J  [: U---------------------------------------------------------------------------
5 U3 e2 l0 T/ R& z|   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |6 H# m# x1 C( V8 Z" \
|   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |9 k; W! f) i0 o% f: P5 U2 e5 d
|   2 |   TABLE ACCESS FULL| T    |   900 |  7200 |     3   (0)| 00:00:01 |
" r6 ]% D, I; i---------------------------------------------------------------------------
( \9 K/ O) O" ?6 a3 `2 z. CSQL_ID  7qcp6urqh7d2j, child number 25 p7 s9 G. x6 ]7 e8 u
-------------------------------------0 W+ D/ _2 e7 ^5 D
select sum(object_id) from t where id2号子游标为全表扫描,但其预估的行数接近实际影响行数的值为800
4 F0 M% H; R; N+ V; M  ePlan hash value: 2966233522
5 t4 f( F& R2 u9 p( S( U; e---------------------------------------------------------------------------
6 H/ ]: n4 D; [3 c1 Q* q9 k+ ~| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
* [( D% q3 ]7 F/ q: r2 A, F) F---------------------------------------------------------------------------
7 F# _; n  a+ _3 s. t. V|   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |
8 ?9 q3 }* B6 c|   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |
& N# u0 Z- ^8 U, A|   2 |   TABLE ACCESS FULL| T    |   800 |  6400 |     3   (0)| 00:00:01 |
, a9 L. |; [3 W9 \$ Z( b---------------------------------------------------------------------------" t* N% b2 Q) ]
SQL_ID  7qcp6urqh7d2j, child number 3
% \0 J% K+ M% X6 O3 L) |& x$ |9 a; {! Q-------------------------------------; [3 f3 I, ?! Y5 z$ N" P$ f
select sum(object_id) from t where id3号子游标为全表扫描,但其预估的行数等于实际影响行数的值499
: a1 t1 k6 L3 M5 `Plan hash value: 2966233522! p- ~" t1 g, [- k3 i1 o. F# t% h
---------------------------------------------------------------------------
) s, |3 ?3 a) _| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
8 _/ B. T8 M4 l---------------------------------------------------------------------------0 i3 i  Y6 Z$ Y3 J3 G6 Y
|   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |
& @; Z$ S3 ?% l|   1 |  SORT AGGREGATE    |      |     1 |     8 |            |          |3 m$ M+ H4 l* ]5 \! D. E* m
|   2 |   TABLE ACCESS FULL| T    |   499 |  3992 |     3   (0)| 00:00:01 |
2 G! P5 e$ U/ R* y---------------------------------------------------------------------------8 P5 P( `& Z4 I  A. W4 h
二、自适应游标共享的几个相关视图
2 T3 x! J  V4 z: [. A6 d* q1 f 1、v$sql_cs_statistics
2 R  Q" u' j# _# n        用于监控自适应游标共享的相关统计信息.下面的查询中列出了每个子游标的peeking情况,以及执行次数,预处理行数,BUFFER_GETS等
! ]8 Y5 X. o/ _$ n7 P4 c( ISQL> select child_number,bind_set_hash_value,peeked,executions,rows_processed,buffer_gets) B. z0 o" c$ A7 f) y
  2  from v$sql_cs_statistics where sql_id='7qcp6urqh7d2j'* [* G& w1 E! x+ \; e7 [% {, O3 L
  3  order by 1;
2 t& Z$ Z" K9 o$ eCHILD_NUMBER BIND_SET_HASH_VALUE P EXECUTIONS ROWS_PROCESSED BUFFER_GETS7 K& h; s; ?! U; C, F
------------ ------------------- - ---------- -------------- -----------
5 U# f, z' H( P           0          1706589901 Y          1             17          69     -->17行,索引范围扫描
% d- I6 ~1 d$ {. Y! V9 T           1          3116944019 Y          1            900           5     -->900行,全表扫描9 C2 S+ G% M9 h# K: t
           2          1328865654 Y          1            800           5     -->800行,全表扫描( ]+ j/ M9 W0 W3 w, l* L' L1 \
           3          1624350242 Y          1            500           5     -->500行,全表扫描
% V3 }- ~/ t4 z# r' {2 j    2、v$sql_cs_selectivity2 z! N1 Y0 M# J# h6 V! |; U( B+ O
        显示每个子游标的游标的选择性范围。下面的查询中列出了谓词,选择性范围,列上的选择性的值6 {, X( S8 S7 l6 A3 i! D( Y1 \( ]
SQL> select child_number,predicate,range_id,low,high from v$sql_cs_selectivity
; @- t9 z+ u3 }5 p* l; ?  2  where sql_id='7qcp6urqh7d2j' order by 1;
( Y) t7 ?  |5 K6 D  r
: E% ?' h% y7 Y5 s7 N5 oCHILD_NUMBER PREDICATE            RANGE_ID LOW        HIGH+ e9 o9 v) `) x% m
------------ ------------------ ---------- ---------- ----------
" ]. ~) E; W* q# G* E. F2 w           1
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 10:51 , Processed in 0.662788 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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