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

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 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, 由于优化器模式(optimizer_mode)不同而产生子游标

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, 由于对象权限不同(auth_check_mismatch)而产生子游标

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, 由于变量长度不同(incomplete_cursor)而产生子游标

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值