您的位置:首页 > 数据库 > Oracle

<<Oracle数据库性能优化艺术(第五期)>> 第10周 变量邦定(包括11g下Adaptive cursor sharing技术)

2014-02-16 15:31 711 查看
1.用示例说明绑定变量的应用领域是OLTP而不是OLAP。
示例:
SQL> drop table t purge;

Table dropped.

SQL> create table t as select * from dba_objects where rownum < 2000;

Table created.

SQL> create index idx_t_objid on t(object_id);

Index created.

SQL> exec dbms_stats.gather_table_stats(user,'T',method_opt=>'for all indexed columns size 254');

PL/SQL procedure successfully completed.

SQL> set autotrace traceonly;
SQL> variable objid number;
SQL> exec :objid := 2;

PL/SQL procedure successfully completed.

SQL> select * from t where object_id < :objid;

no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 3638283050

-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100 | 8500 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 100 | 8500 | 3 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_OBJID | 18 | | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("OBJECT_ID"

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
1026 bytes sent via SQL*Net to client
339 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed

SQL> exec :objid := 2000;

PL/SQL procedure successfully completed.

SQL> select * from t where object_id < :objid;
(由于使用了绑定变量,SQL沿用了已有的执行计划,没有根据where条件里变量值的不同而重新生成更优的执行计划)
1943 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 3638283050

-------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 100 | 8500 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 100 | 8500 | 3 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_OBJID | 18 | | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("OBJECT_ID"

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
287 consistent gets
0 physical reads
0 redo size
117777 bytes sent via SQL*Net to client
1769 bytes received via SQL*Net from client
131 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1943 rows processed

SQL> select * from t where object_id < 2000;
(在不使用绑定变量的情况下再次执行,SQL生成了最优执行计划)
1943 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1937 | 160K| 10 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1937 | 160K| 10 (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("OBJECT_ID"<2000)

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
156 consistent gets
0 physical reads
0 redo size
117777 bytes sent via SQL*Net to client
1769 bytes received via SQL*Net from client
131 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1943 rows processed

SQL>

由于OLAP运行的都是报表类程序, SQL数量少且每个SQL执行的次数也较少, 所以即使每次都硬解析也不会造成太多额外开销, 而where条件不同的值对SQL选择执行计划影响很大, 所以使用绑定变量反而会导致继续沿用不恰当的执行计划.

OLTP由于多是小而重复的事务, 减少硬解析可以很大程度地降低系统资源争用, 故而更适合使用绑定变量.

--EOF--

2.用示例演示一次硬分析(hard parse)和一次软分析(soft parse),以及一次更软的分析(softer soft parse),并对给出演示结果。
SQL> drop table t purge;

Table dropped.

SQL> create table t as select * from dba_objects where rownum < 2000;

Table created.

SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush shared_pool;

System altered.

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable, sql_text from v$sql where sql_text like 'select count(*) from t';

no rows selected

SQL> select count(*) from t;

COUNT(*)
----------
1999

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable, sql_text from v$sql where sql_text like 'select count(*) from t';
(硬解析)
SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - ----------------------------------------------------------------------------------------------------
cyzznbykb509s 0 1 1 1 1 N Y select count(*) from t

SQL> select count(*) from t;

COUNT(*)
----------
1999

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable, sql_text from v$sql where sql_text like 'select count(*) from t';
(软解析)
SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - ----------------------------------------------------------------------------------------------------
cyzznbykb509s 0 1 2 2 2 N Y select count(*) from t

SQL>

更软解析(分析一次,执行10次)
SQL> begin for i in 1..10 loop execute immediate 'select count(*) from t'; end loop; end;
2 /

PL/SQL procedure successfully completed.

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable, sql_text from v$sql where sql_text like 'select count(*) from t';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - ----------------------------------------------------------------------------------------------------
cyzznbykb509s 0 1 2 2 2 N Y select count(*) from t
cyzznbykb509s 1 1 1 10 0 N Y select count(*) from t

SQL>

--EOF--

3.用示例演示一次分析,多次执行的示例,并对给出演示结果。
示例: 一次分析,10次执行
SQL> create table t1 as select * from dba_objects where rownum < 100;

Table created.

SQL> begin
2 for i in 1..10 loop
3 execute immediate 'select * from t1 where object_id = :id' using i;
4 end loop;
5 end;
6 /

PL/SQL procedure successfully completed.

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select * from t1 where object_id = :id';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - ------------------------------------------------
gj5gsnt6mq06m 0 1 1 10 0 N Y select * from t1 where object_id = :id

SQL>

--EOF--

4.演示一个父游标产生3个子游标的示例,并分别说明每个子游标产生的原因。
示例1, 由于优化器模式([b]optimizer_mode)不同而产生子游标[/b]
SQL> create table t2 as select * from dba_objects where rownum <100;

Table created.

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2;';

no rows selected

SQL> show parameter optimizer_mode

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_mode string ALL_ROWS
SQL> select count(*) from t2;

COUNT(*)
----------
99

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - ---------------------------------------
94dwfa8yd87kw 0 1 1 1 1 N Y select count(*) from t2

SQL> alter session set optimizer_mode=first_rows;

Session altered.

SQL> show parameter optimizer_mode

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_mode string FIRST_ROWS
SQL> select count(*) from t2;

COUNT(*)
----------
99

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - -------------------------------------
94dwfa8yd87kw 0 1 1 1 1 N Y select count(*) from t2
94dwfa8yd87kw 1 1 1 1 1 N Y select count(*) from t2

SQL> select sql_id,child_number,optimizer_mode_mismatch from v$sql_shared_cursor where sql_id='94dwfa8yd87kw';

SQL_ID CHILD_NUMBER O
------------- ------------ -
94dwfa8yd87kw 0 N
94dwfa8yd87kw 1 Y

SQL>

示例2, 由于对象权限[b]不同(auth_check_mismatch)而产生子游标[/b]
SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush shared_pool;

System altered.

SQL> create table scott.t2 as select * from apps.t2;

Table created.

SQL> show user;
USER is "APPS"
SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2';

no rows selected

SQL> select count(*) from t2;

COUNT(*)
----------
99

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - -------------------------
94dwfa8yd87kw 0 1 1 1 1 N Y select count(*) from t2

SQL> conn scott/tiger@rclsh
Connected.
SQL> show user;
USER is "SCOTT"
SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - -----------------------------
94dwfa8yd87kw 0 1 1 1 1 N Y select count(*) from t2

SQL> select count(*) from t2;

COUNT(*)
----------
99

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - ---------------------------
94dwfa8yd87kw 0 1 1 1 1 N Y select count(*) from t2
94dwfa8yd87kw 1 1 1 1 1 N Y select count(*) from t2

SQL> select sql_id,child_number,optimizer_mode_mismatch,auth_check_mismatch from v$sql_shared_cursor where sql_id='94dwfa8yd87kw';

SQL_ID CHILD_NUMBER O A
------------- ------------ - -
94dwfa8yd87kw 0 N N
94dwfa8yd87kw 1 N Y

SQL>

示例3, 由于变量[b]长度不同(incomplete_cursor)而产生子游标[/b]
SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush shared_pool;

System altered.

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2 where object_name=:name';

no rows selected

SQL> var name varchar2(20);
SQL> exec :name := 'AAA';

PL/SQL procedure successfully completed.

SQL> select count(*) from t2 where object_name=:name;

COUNT(*)
----------
0

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2 where object_name=:name';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - -----------------------------------------------------------------------------
dqyxszpk5b9ba 0 1 1 1 1 N Y select count(*) from t2 where object_name=:name

SQL> var name varchar2(200);
SQL> exec :name := 'AAA';

PL/SQL procedure successfully completed.

SQL> select count(*) from t2 where object_name=:name;

COUNT(*)
----------
0

SQL> select sql_id,child_number,loads, parse_calls, executions, fetches, is_bind_aware,is_shareable,
2 sql_text from v$sql where sql_text like 'select count(*) from t2 where object_name=:name';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - -----------------------------------------------------------------------------
dqyxszpk5b9ba 0 1 2 1 1 N N select count(*) from t2 where object_name=:name
dqyxszpk5b9ba 1 1 0 1 1 N Y select count(*) from t2 where object_name=:name

SQL> select sql_id,child_number,optimizer_mode_mismatch,auth_check_mismatch,incomplete_cursor from v$sql_shared_cursor where sql_id='dqyxszpk5b9ba';

SQL_ID CHILD_NUMBER O A I
------------- ------------ - - -
dqyxszpk5b9ba 0 N N N
dqyxszpk5b9ba 1 N N Y

SQL>

--EOF--

5.演示ACS(adaptiver cursor sharing)的效果。

由于autotrace在使用绑定变量的时会出现执行计划显示不正确的情况,以下例子使用了10046 trace进行跟踪.

SQL> drop table t purge;

Table dropped.

SQL> create table t as select * from dba_objects where rownum < 2000;

Table created.

SQL> update t set object_id = 1 where rownum =1;

1 row updated.

SQL> update t set object_id = 99 where object_id !=1;

1998 rows updated.

SQL> commit;

Commit complete.

SQL> select object_id,count(*) from t group by object_id;

OBJECT_ID COUNT(*)
---------- ----------
1 1
99 1998

SQL> create index idx_t_objid on t(object_id);

Index created.

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade=>true,method_opt=>'for all indexed columns size 254');

PL/SQL procedure successfully completed.

SQL> alter system flush shared_pool;

System altered.

SQL> alter system flush shared_pool;

System altered.

SQL> var objid number;
SQL> alter session set events '10046 trace name context forever, level 12';

Session altered.

SQL> select sql_id,child_number,loads,parse_calls,executions,fetches,is_bind_sensitive,is_bind_aware,
2 is_shareable,sql_text from v$sql where sql_text like 'select * from t where object_id = :objid';

no rows selected

SQL> exec :objid := 1;

PL/SQL procedure successfully completed.

SQL> select * from t where object_id = :objid;

OWNER OBJECT_NAME SUBOBJECT_NAME
------------------------------ -------------------------------------------------------------------------------------------------------------------------------- ------------------------------
OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_ TIMESTAMP STATUS T G S NAMESPACE EDITION_NAME
---------- -------------- ------------------- --------- --------- ------------------- ------- - - - ---------- ------------------------------
SYS ICOL$
1 2 TABLE 02-APR-10 02-APR-10 2010-04-02:13:18:38 VALID N N N 1

SQL> exec :objid := 99;

PL/SQL procedure successfully completed.

SQL> select * from t where object_id = :objid;

... (此处省略输出结果)

1998 rows selected.

SQL> select sql_id,child_number,loads,parse_calls,executions,fetches,is_bind_sensitive,is_bind_aware,
2 is_shareable,sql_text from v$sql where sql_text like 'select * from t where object_id = :objid';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - - ------------------------------------------
5qn4zd1az2xd8 0 1 2 2 137 Y N Y select * from t where object_id = :objid
is_bind_sensitive=Y说明已经察觉到变量值改变了,is_bind_aware=N说明尚未就变量改变生成新的执行计划)
SQL> select * from t where object_id = :objid;

... (此处省略输出结果)

1998 rows selected.

SQL> select sql_id,child_number,loads,parse_calls,executions,fetches,is_bind_sensitive,is_bind_aware,
2 is_shareable,sql_text from v$sql where sql_text like 'select * from t where object_id = :objid';

SQL_ID CHILD_NUMBER LOADS PARSE_CALLS EXECUTIONS FETCHES I I I SQL_TEXT
------------- ------------ ---------- ----------- ---------- ---------- - - - -------------------------------------------
5qn4zd1az2xd8 0 1 3 2 137 Y N Y select * from t where object_id = :objid
5qn4zd1az2xd8 1 1 0 1 135 Y Y Y select * from t where object_id = :objid

SQL> select sql_id,child_number,bind_equiv_failure from v$sql_shared_cursor where sql_id='5qn4zd1az2xd8';

SQL_ID CHILD_NUMBER B
------------- ------------ -
5qn4zd1az2xd8 0 N
5qn4zd1az2xd8 1 Y

SQL> alter session set events '10046 trace name context off';

Session altered.

SQL> select value from v$diag_info where name='Default Trace File';

VALUE
--------------------------------------------------------------------------------------
c:\app\diag\rdbms\d11r2i\d11r2i\trace\d11r2i_ora_5376.trc

SQL>

c:\app\diag\rdbms\d11r2i\d11r2i\trace>tkprof d11r2i_ora_5376.trc d11r2i_ora_5376.trc.prf sys=no aggregate=no

TKPROF: Release 11.2.0.1.0 - Development on Wed Dec 4 19:20:26 2013

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

c:\app\diag\rdbms\d11r2i\d11r2i\trace>notepad d11r2i_ora_5376.trc.prf

c:\app\diag\rdbms\d11r2i\d11r2i\trace>

trace文件部分内容:
...
********************************************************************************

SQL ID: dcx717n8x3071
Plan Hash: 0
BEGIN :objid := 1; END;

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.00 0.00 0 0 0 1

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84

Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 10.42 10.42
********************************************************************************

SQL ID: 5qn4zd1az2xd8
Plan Hash: 3638283050
select *
from
t where object_id = :objid

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.00 0.00 0 4 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.00 0 4 0 1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows Row Source Operation
------- ---------------------------------------------------
1 TABLE ACCESS BY INDEX ROWID T (cr=4 pr=0 pw=0 time=0 us cost=2 size=85 card=1)
1 INDEX RANGE SCAN IDX_T_OBJID (cr=3 pr=0 pw=0 time=0 us cost=1 size=0 card=1)(object id 74570)
(先生成一个适合走索引的执行计划)

Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 2 0.00 0.00
SQL*Net message from client 2 26.42 26.42
********************************************************************************

SQL ID: 5j801dbwcy9mh
Plan Hash: 0
BEGIN :objid := 99; END;

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 1
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 0.00 0.00 0 0 0 1

Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84

Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 1 0.00 0.00
SQL*Net message from client 1 17.84 17.84
********************************************************************************

SQL ID: 5qn4zd1az2xd8
Plan Hash: 3638283050
select *
from
t where object_id = :objid

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 135 0.00 0.01 0 295 0 1998
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 137 0.00 0.01 0 295 0 1998

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows Row Source Operation
------- ---------------------------------------------------
1998 TABLE ACCESS BY INDEX ROWID T (cr=295 pr=0 pw=0 time=10118 us cost=2 size=85 card=1)
1998 INDEX RANGE SCAN IDX_T_OBJID (cr=139 pr=0 pw=0 time=9111 us cost=1 size=0 card=1)(object id 74570)
(绑定变量值改变后,第一次执行时仍沿用已有的执行计划)

Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 135 0.00 0.00
SQL*Net message from client 135 31.09 38.35
********************************************************************************

select sql_id,child_number,loads,parse_calls,executions,fetches,is_bind_sensitive,is_bind_aware,
is_shareable,sql_text from v$sql where sql_text like 'select * from t where object_id = :objid'

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 2 0.01 0.00 0 0 0 1
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.01 0.00 0 0 0 1

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows Row Source Operation
------- ---------------------------------------------------
1 FIXED TABLE FULL X$KGLCURSOR_CHILD (cr=0 pr=0 pw=0 time=0 us cost=0 size=601 card=1)

Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 2 0.00 0.00
SQL*Net message from client 2 35.39 35.40
********************************************************************************

SQL ID: 5qn4zd1az2xd8
Plan Hash: 1601196873
select *
from
t where object_id = :objid

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 135 0.01 0.01 0 159 0 1998
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 137 0.01 0.01 0 159 0 1998

Misses in library cache during parse: 0
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 84

Rows Row Source Operation
------- ---------------------------------------------------
1998 TABLE ACCESS FULL T (cr=159 pr=0 pw=0 time=8653 us cost=10 size=169830 card=1998)
(绑定变量值改变后,第二次执行时采用ACS,得到正确执行计划)

Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 135 0.00 0.00
SQL*Net message from client 135 27.11 36.53
********************************************************************************
...

参考:
Wrong explain plan in Oracle autotrace
http://kokeiblog.blogspot.com/2010/09/wrong-explain-plan-in-oracle-autotrace_27.html
Adaptive Cursor Sharing in Oracle Database 11g Release 1
http://www.oracle-base.com/articles/11g/adaptive-cursor-sharing-11gr1.php
--EOF--
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: