<<Oracle数据库性能优化艺术(第五期)>> 第12周 10053事件

1.验证全表扫描的成本计算公式,贴出执行计划和计算公式。

SQL> select * from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production

SQL> drop table t purge;

Table dropped.

SQL> create table t as select * from dba_objects where 1=0 ;

Table created.

SQL> alter table t pctfree 99 pctused 1;

Table altered.

SQL> insert into t select * from dba_objects where rownum<2;

1 row created.

SQL> alter table t minimize records_per_block;

Table altered.

SQL> insert into t select * from dba_objects where rownum<1000;

999 rows created.

SQL> commit;

Commit complete.

SQL> exec DBMS_STATS.GATHER_TABLE_STATS(user,'T');

PL/SQL procedure successfully completed.

SQL> select blocks,last_analyzed,sysdate from dba_tables where table_name='T' and owner=user;

    BLOCKS LAST_ANAL SYSDATE
---------- --------- ---------
      1000 18-DEC-13 18-DEC-13

SQL> show parameter db_file_multiblock_read_count

NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------------
db_file_multiblock_read_count        integer     128
SQL> set autotrace on
SQL> select count(*) from t;

  COUNT(*)
----------
      1000


Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |   272   (1)| 00:00:04 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    |  1000 |   272   (1)| 00:00:04 |
-------------------------------------------------------------------


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

SQL>

成本的计算方式如下:
Cost = (
       #SRds * sreadtim +
       #MRds * mreadtim +
       CPUCycles / cpuspeed
       ) / sreadtime
      
#SRds - number of single block reads
#MRds - number of multi block reads
#CPUCyles - number of CPU cycles

sreadtim - single block read time
mreadtim - multi block read time
cpuspeed - CPU cycles per second

注意:如果没有收集过系统统计信息,那么Oracle采用非工作量统计,如果收集了,Oracle采用工作量统计的计算方法
SQL> set autot off
SQL> select pname, pval1 from sys.aux_stats$ where sname='SYSSTATS_MAIN';

PNAME                     PVAL1
-------------------- ----------
CPUSPEEDNW                  646
IOSEEKTIM                    10
IOTFRSPEED                 4096
SREADTIM                      0
MREADTIM
CPUSPEED                   1440
MBRC
MAXTHR
SLAVETHR

9 rows selected.

SQL>
这里因为MBRC 为0,所以CBO采用了非工作量(noworkload)来计算成本

#SRds=0,因为是全表扫描,单块读为0
#MRds=表的块数/多块读参数=1000/128

mreadtim=ioseektim+db_file_multiblock_count*db_block_size/iotftspeed

select (select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM') +
      (select value from v$parameter where name = 'db_file_multiblock_read_count') *
       (select value from v$parameter where name = 'db_block_size') /
       (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "mreadtim"
from dual;


SQL> select (select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM') +
  2        (select value from v$parameter where name = 'db_file_multiblock_read_count') *
  3         (select value from v$parameter where name = 'db_block_size') /
  4         (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "mreadtim"
  5  from dual;

  mreadtim
----------
       266

SQL>

sreadtim=ioseektim+db_block_size/iotfrspeed

select (select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM') +
       (select value from v$parameter where name = 'db_block_size') /
       (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "sreadtim"
from dual;

SQL> select (select pval1 from sys.aux_stats$ where pname = 'IOSEEKTIM') +
  2         (select value from v$parameter where name = 'db_block_size') /
  3         (select pval1 from sys.aux_stats$ where pname = 'IOTFRSPEED') "sreadtim"
  4  from dual;

  sreadtim
----------
        12

SQL>


CPUCycles 等于 PLAN_TABLE里面的CPU_COST

SQL> truncate table plan_table;

Table truncated.

SQL> select cpu_cost from plan_table;

no rows selected

SQL> explain plan for select count(*) from t;

Explained.

SQL> select cpu_cost from plan_table;

  CPU_COST
----------
   7271440

   7271440

SQL>


cpuspeed 等于 CPUSPEEDNW = 646

那么COST=(0+1000/128*266+7271440/646/1000)/12
SQL> select ceil((0+1000/128*266+7271440/646/1000)/12) from dual;

CEIL((0+1000/128*266+7271440/646/1000)/12)
------------------------------------------
                                       175

SQL>


最后算出来的结果对不上,不知道是不是因为采用了自动表空间管理的问题.

参考:
http://blog.csdn.net/robinson1988/article/details/6603016

--EOF--


2.给出B-tree索引 Unique scan的成本计算公式,贴出执行计划和计算公式。

SQL> drop table t1 purge;

Table dropped.

SQL> create table t1 as select * from dba_objects where object_id is not null ;

Table created.

SQL> alter table t1 add primary key(object_id);

Table altered.

SQL> set autot traceonly
SQL> select object_name from t1 where object_id=100;


Execution Plan
----------------------------------------------------------
Plan hash value: 278582351

----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    79 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1             |     1 |    79 |     3   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | SYS_C001104405 |     1 |       |     2   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

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

   2 - access("OBJECT_ID"=100)


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

SQL> set autot off
SQL> select INDEX_NAME, BLEVEL, LEAF_BLOCKS, CLUSTERING_FACTOR,NUM_ROWS from user_ind_statistics where table_name='T1';

INDEX_NAME                         BLEVEL LEAF_BLOCKS CLUSTERING_FACTOR   NUM_ROWS
------------------------------ ---------- ----------- ----------------- ----------
SYS_C001104405                          2         843              5906     393396

SQL>

Index Unique Scan的cost=blevel+1
从user_ind_statistics中看到unique index SYS_C001104405的blevel=2
cost=blevel+1=3,和执行计划中估算的成本一致。

参考:
http://f.dataguru.cn/thread-150776-1-1.html

--EOF--


3.通过10053事件分析一个SQL执行计划的产生过程,需要贴出trace中的相关信息和必要的文字说明。

SQL> drop table t purge;

Table dropped.

SQL> create table t as select * from dba_objects;

Table created.

SQL> create index idx_t_objid on t(object_id);

Index created.

SQL> exec dbms_stats.gather_table_stats(user,'T');

PL/SQL procedure successfully completed.

SQL> ALTER SESSION SET EVENTS '10053 trace name context forever, level 1';

Session altered.

SQL> select count(*) from t where object_id = 99;

  COUNT(*)
----------
         1

SQL> ALTER SESSION SET EVENTS '10053 trace name context off';

Session altered.

SQL> select name,value from v$diag_info where name like 'Default Trace%';

NAME
----------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
Default Trace File
/ebs/oracle/ORCL/db/tech_st/11.1.0/admin/ORCL_localhost/diag/rdbms/orcl/
ORCL/trace/ORCL_ora_9470.trc


SQL>

view /ebs/oracle/ORCL/db/tech_st/11.1.0/admin/ORCL_localhost/diag/rdbms/orcl/ORCL/trace/ORCL_ora_9470.trc

Trace file /ebs/oracle/ORCL/db/tech_st/11.1.0/admin/ORCL_localhost/diag/rdbms/orcl/ORCL/trace/ORCL_ora_9470.trc
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production #数据库与OS信息
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /ebs/oracle/ORCL/db/tech_st/11.1.0
System name:    Linux
Node name:    localhost.example.com
Release:    2.6.32-300.10.1.el5uek
Version:    #1 SMP Wed Feb 22 17:37:40 EST 2012
Machine:    x86_64
Instance name: ORCL
Redo thread mounted by this instance: 1
Oracle process number: 33
Unix process pid: 9470, image: oracle@localhost.example.com (TNS V1-V3)


*** 2013-12-19 19:01:58.707 #session信息
*** SESSION ID:(354.13989) 2013-12-19 19:01:58.707
*** CLIENT ID:() 2013-12-19 19:01:58.707
*** SERVICE NAME:(SYS$USERS) 2013-12-19 19:01:58.707
*** MODULE NAME:(SQL*Plus) 2013-12-19 19:01:58.707
*** ACTION NAME:() 2013-12-19 19:01:58.707
 
Registered qb: SEL$1 0xe91cbeb0 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
  signature (): qb_name=SEL$1 nbfros=1 flg=0
    fro(0): flg=4 objn=3326788 hint_alias="T"@"SEL$1"

SPM: statement not found in SMB
DOP: Automatic degree of parallelism is disabled: Parameter.
PM: Considering predicate move-around in query block SEL$1 (#0)
**************************
Predicate Move-Around (PM)
**************************
OPTIMIZER INFORMATION

****************************************** #sql语句
----- Current SQL Statement for this session (sql_id=8zsvg3vy69zy8) -----
select count(*) from t where object_id = 99
*******************************************
Legend
The following abbreviations are used by optimizer trace. #缩略词解释
CBQT - cost-based query transformation
JPPD - join predicate push-down
OJPPD - old-style (non-cost-based) JPPD
FPD - filter push-down
PM - predicate move-around
CVM - complex view merging
SPJ - select-project-join
SJC - set join conversion
SU - subquery unnesting
OBYE - order by elimination
ST - star transformation
CNT - count(col) to count(*) transformation
JE - Join Elimination
qb - query block
LB - leaf blocks
DK - distinct keys
LB/K - average number of leaf blocks per key
DB/K - average number of data blocks per key
CLUF - clustering factor
NDV - number of distinct values
Resp - response cost
Card - cardinality
Resc - resource cost
NL - nested loops (join)
SM - sort merge (join)
HA - hash (join)
CPUSPEED - CPU Speed
IOTFRSPEED - I/O transfer speed
IOSEEKTIM - I/O seek time
SREADTIM - average single block read time
MREADTIM - average multiblock read time
MBRC - average multiblock read count
MAXTHR - maximum I/O system throughput
SLAVETHR - average slave I/O throughput
dmeth - distribution method
  1: no partitioning required
  2: value partitioned
  4: right is random (round-robin)
  128: left is random (round-robin)
  8: broadcast right and partition left
  16: broadcast left and partition right
  32: partition left using partitioning of right
  64: partition right using partitioning of left
  256: run the join in serial
  0: invalid distribution method
sel - selectivity
ptn - partition
*************************************** #优化器使用的参数
PARAMETERS USED BY THE OPTIMIZER
********************************
  *************************************
  PARAMETERS WITH ALTERED VALUES
  ******************************
Compilation Environment Dump
_sort_elimination_cost_ratio        = 5
_pga_max_size                       = 209700 KB
_b_tree_bitmap_plans                = false
_fast_full_scan_enabled             = false
_index_join_enabled                 = false
_like_with_bind_as_equality         = true
optimizer_secure_view_merging       = false
Bug Fix Control Environment


  *************************************
  PARAMETERS WITH DEFAULT VALUES
  ******************************
Compilation Environment Dump
optimizer_mode_hinted               = false
... (为减少版面,省略部分参数)
_bloom_pushing_max                  = 524288
Bug Fix Control Environment
    fix  3834770 = 1       
    fix  3746511 = enabled
...
    fix  7295298 = enabled


  ***************************************
  PARAMETERS IN OPT_PARAM HINT
  ****************************
***************************************
Column Usage Monitoring is ON: tracking level = 1
***************************************

Considering Query Transformations on query block SEL$1 (#0)
************************** #查询转换与重写
Query transformations (QT)
**************************
CBQT bypassed for query block SEL$1 (#0): no complex view or sub-queries.
CBQT: Validity checks failed for 8zsvg3vy69zy8.
CSE: Considering common sub-expression elimination in query block SEL$1 (#0)
*************************
Common Subexpression elimination (CSE)
*************************
CSE:     CSE not performed on query block SEL$1 (#0).
OBYE:   Considering Order-by Elimination from view SEL$1 (#0)
***************************
Order-by elimination (OBYE)
***************************
OBYE:     OBYE bypassed: no order by to eliminate.
CVM: Considering view merge in query block SEL$1 (#0)
CNT:   Considering count(col) to count(*) on query block SEL$1 (#0)
*************************
Count(col) to Count(*) (CNT)
*************************
CNT:     COUNT() to COUNT(*) not done.
query block SEL$1 (#0) unchanged
Considering Query Transformations on query block SEL$1 (#0)
**************************
Query transformations (QT)
**************************
CBQT bypassed for query block SEL$1 (#0): no complex view or sub-queries.
CBQT: Validity checks failed for 8zsvg3vy69zy8.
CSE: Considering common sub-expression elimination in query block SEL$1 (#0)
*************************
Common Subexpression elimination (CSE)
*************************
CSE:     CSE not performed on query block SEL$1 (#0).
SU: Considering subquery unnesting in query block SEL$1 (#0)
********************
Subquery Unnest (SU)
********************
SJC: Considering set-join conversion in query block SEL$1 (#0)
*************************
Set-Join Conversion (SJC)
*************************
SJC: not performed
PM: Considering predicate move-around in query block SEL$1 (#0)
**************************
Predicate Move-Around (PM)
**************************
PM:     PM bypassed: Outer query contains no views.
PM:     PM bypassed: Outer query contains no views.
query block SEL$1 (#0) unchanged
FPD: Considering simple filter push in query block SEL$1 (#0)
"T"."OBJECT_ID"=99
try to generate transitive predicate from check constraints for query block SEL$1 (#0)
finally: "T"."OBJECT_ID"=99

apadrv-start sqlid=10368252946011193288
  :
    call(in-use=592, alloc=16344), compile(in-use=46496, alloc=49248), execution(in-use=2112, alloc=4032)

*******************************************
Peeked values of the binds in SQL statement
*******************************************

Final query after transformations:******* UNPARSED QUERY IS *******
SELECT COUNT(*) "COUNT(*)" FROM "APPS"."T" "T" WHERE "T"."OBJECT_ID"=99
kkoqbc: optimizing query block SEL$1 (#0)
        
        :
    call(in-use=640, alloc=16344), compile(in-use=47408, alloc=49248), execution(in-use=2112, alloc=4032)

kkoqbc-subheap (create addr=0x7f87e91d12a8)
**************** #查询语句
QUERY BLOCK TEXT
****************
select count(*) from t where object_id = 99
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (optimizer): qb_name=SEL$1 nbfros=1 flg=0
  fro(0): flg=0 objn=3326788 hint_alias="T"@"SEL$1"

----------------------------- #系统统计信息
SYSTEM STATISTICS INFORMATION
-----------------------------
  Using NOWORKLOAD Stats
  CPUSPEEDNW: 646 millions instructions/sec (default is 100)
  IOTFRSPEED: 4096 bytes per millisecond (default is 4096)
  IOSEEKTIM: 10 milliseconds (default is 10)
  MBRC: -1 blocks (default is 8)

***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
  Table:  T  Alias:  T
    #Rows: 393484  #Blks:  5638  AvgRowLen:  97.00
Index Stats::
  Index: IDX_T_OBJID  Col#: 4
    LVLS: 2  #LB: 898  #DK: 392128  LB/K: 1.00  DB/K: 1.00  CLUF: 5915.00
Access path analysis for T
*************************************** #访问路径与成本估计
SINGLE TABLE ACCESS PATH
  Single Table Cardinality Estimation for T[T]
  Table: T  Alias: T
    Card: Original: 393484.000000  Rounded: 1  Computed: 1.00  Non Adjusted: 1.00
  Access Path: TableScan
    Cost:  1547.37  Resp: 1547.37  Degree: 0
      Cost_io: 1529.00  Cost_cpu: 142456519
      Resp_io: 1529.00  Resp_cpu: 142456519
  Access Path: index (AllEqRange)
    Index: IDX_T_OBJID
    resc_io: 3.00  resc_cpu: 21764
    ix_sel: 0.000003  ix_sel_with_filters: 0.000003
    Cost: 3.00  Resp: 3.00  Degree: 1
  Best:: AccessPath: IndexRange
  Index: IDX_T_OBJID
         Cost: 3.00  Degree: 1  Resp: 3.00  Card: 1.00  Bytes: 0

***************************************


OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
*************************************** #连接置换与成本计算
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]:  T[T]#0
***********************
Best so far:  Table#: 0  cost: 3.0028  card: 1.0032  bytes: 6
***********************
(newjo-stop-1) k:0, spcnt:0, perm:1, maxperm:2000

*********************************
Number of join permutations tried: 1
*********************************
Trying or-Expansion on query block SEL$1 (#0)
Transfer Optimizer annotations for query block SEL$1 (#0)
id=0 frofkks[i] (index start key) predicate="T"."OBJECT_ID"=99
id=0 frofkke[i] (index stop key) predicate="T"."OBJECT_ID"=99
Final cost for query block SEL$1 (#0) - All Rows Plan:
  Best join order: 1
  Cost: 3.0028  Degree: 1  Card: 1.0000  Bytes: 6
  Resc: 3.0028  Resc_io: 3.0000  Resc_cpu: 21764
  Resp: 3.0028  Resp_io: 3.0000  Resc_cpu: 21764
kkoqbc-subheap (delete addr=0x7f87e91d12a8, in-use=12056, alloc=13576)
kkoqbc-end:
        :
    call(in-use=7000, alloc=32712), compile(in-use=48232, alloc=49248), execution(in-use=2112, alloc=4032)

kkoqbc: finish optimizing query block SEL$1 (#0)
apadrv-end
          :
    call(in-use=7000, alloc=32712), compile(in-use=49176, alloc=53392), execution(in-use=2112, alloc=4032)


Starting SQL statement dump

user_id=65 user_name=APPS module=SQL*Plus action=
sql_id=8zsvg3vy69zy8 plan_hash_value=572429185 problem_type=3
----- Current SQL Statement for this session (sql_id=8zsvg3vy69zy8) -----
select count(*) from t where object_id = 99
sql_text_length=44
sql=select count(*) from t where object_id = 99
----- Explain Plan Dump -----
----- Plan Table -----
 
============ #执行计划
Plan Table
============
----------------------------------------+-----------------------------------+
| Id  | Operation          | Name       | Rows  | Bytes | Cost  | Time      |
----------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT   |            |       |       |     3 |           |
| 1   |  SORT AGGREGATE    |            |     1 |     6 |       |           |
| 2   |   INDEX RANGE SCAN | IDX_T_OBJID|     1 |     6 |     3 |  00:00:01 |
----------------------------------------+-----------------------------------+
Predicate Information:
----------------------
2 - access("OBJECT_ID"=99)
 
Content of other_xml column
===========================
  db_version     : 11.1.0.7
  parse_schema   : APPS
  plan_hash      : 572429185
  plan_hash_2    : 2577914714
  Outline Data:
  /*+
    BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.1.0.7')
      DB_VERSION('11.1.0.7')
      OPT_PARAM('_b_tree_bitmap_plans' 'false')
      OPT_PARAM('_fast_full_scan_enabled' 'false')
      OPT_PARAM('_index_join_enabled' 'false')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "T"@"SEL$1" ("T"."OBJECT_ID"))
    END_OUTLINE_DATA
  */
 
Optimizer state dump:
Compilation Environment Dump
optimizer_mode_hinted               = false
...
_bloom_pushing_max                  = 524288
Bug Fix Control Environment
    fix  3834770 = 1       
    fix  3746511 = enabled
...
    fix  7295298 = enabled


Query Block Registry:
SEL$1 0xe91cbeb0 (PARSER) [FINAL]

:
    call(in-use=9984, alloc=32712), compile(in-use=77056, alloc=139080), execution(in-use=5256, alloc=8088)

End of Optimizer State Dump
====================== END SQL Statement Dump ======================


--EOF--


4.当统计信息不准确时,CBO可能产生错误的执行计划,请给出这样的一个例子,在10053 trace中找到CBO出错的位置,并给出必要的文字说明。

SQL> drop table t purge;

Table dropped.

SQL> create table t as select rownum id, o.* from dba_objects o where rownum <= 100;

Table created.

SQL> create index idx_t_id on t(id);

Index created.

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade=>true);

PL/SQL procedure successfully completed.

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

99 rows updated.

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

        ID   COUNT(*)
---------- ----------
         1          1
        99         99

SQL> commit;

Commit complete.

SQL> alter system flush shared_pool; #只有硬解析的情况下才会产生10053trace.

System altered.

SQL> alter session set events '10053 trace name context forever, level 1';

Session altered.

SQL> select * from t where id=99;

...
99 rows selected.

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

Session altered.

SQL> select name,value from v$diag_info where name like 'Default Trace%';

NAME
----------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
Default Trace File
/ebs/oracle/ORCL/db/tech_st/11.1.0/admin/ORCL_localhost/diag/rdbms/orcl/
ORCL/trace/ORCL_ora_13290.trc


SQL>

view /ebs/oracle/ORCL/db/tech_st/11.1.0/admin/ORCL_localhost/diag/rdbms/orcl/ORCL/trace/ORCL_ora_13290.trc

...
***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
  Table:  T  Alias:  T
    #Rows: 100  #Blks:  5  AvgRowLen:  78.00
Index Stats::
  Index: IDX_T_ID  Col#: 1
    LVLS: 0  #LB: 1  #DK: 100  LB/K: 1.00  DB/K: 1.00  CLUF: 2.00
Access path analysis for T
***************************************
SINGLE TABLE ACCESS PATH
  Single Table Cardinality Estimation for T[T]
  Table: T  Alias: T
    Card: Original: 100.000000  Rounded: 1  Computed: 1.00  Non Adjusted: 1.00
  Access Path: TableScan
    Cost:  3.01  Resp: 3.01  Degree: 0
      Cost_io: 3.00  Cost_cpu: 55907
      Resp_io: 3.00  Resp_cpu: 55907
  Access Path: index (AllEqRange)
    Index: IDX_T_ID
    resc_io: 2.00  resc_cpu: 14893
    ix_sel: 0.010000  ix_sel_with_filters: 0.010000
    Cost: 2.00  Resp: 2.00  Degree: 1
  Best:: AccessPath: IndexRange
  Index: IDX_T_ID
         Cost: 2.00  Degree: 1  Resp: 2.00  Card: 1.00  Bytes: 0 #统计信息里index的card是错的

***************************************


OPTIMIZER STATISTICS AND COMPUTATIONS
***************************************
GENERAL PLANS
***************************************
Considering cardinality-based initial join order.
Permutations for Starting Table :0
Join order[1]:  T[T]#0
***********************
Best so far:  Table#: 0  cost: 2.0019  card: 1.0000  bytes: 78
***********************
(newjo-stop-1) k:0, spcnt:0, perm:1, maxperm:2000

*********************************
Number of join permutations tried: 1
*********************************
Trying or-Expansion on query block SEL$1 (#0)
Transfer Optimizer annotations for query block SEL$1 (#0)
id=0 frofkks[i] (index start key) predicate="T"."ID"=99
id=0 frofkke[i] (index stop key) predicate="T"."ID"=99
Final cost for query block SEL$1 (#0) - All Rows Plan:
  Best join order: 1
  Cost: 2.0019  Degree: 1  Card: 1.0000  Bytes: 78
  Resc: 2.0019  Resc_io: 2.0000  Resc_cpu: 14893
  Resp: 2.0019  Resp_io: 2.0000  Resc_cpu: 14893
kkoqbc-subheap (delete addr=0x7f4cf8f08248, in-use=12088, alloc=13672)
kkoqbc-end:
        :
    call(in-use=21336, alloc=49080), compile(in-use=57408, alloc=58792), execution(in-use=2112, alloc=4032)

kkoqbc: finish optimizing query block SEL$1 (#0)
apadrv-end
          :
    call(in-use=21336, alloc=49080), compile(in-use=58320, alloc=58792), execution(in-use=2112, alloc=4032)


Starting SQL statement dump

user_id=65 user_name=APPS module=SQL*Plus action=
sql_id=4qxbkhkmkh6yc plan_hash_value=514881935 problem_type=3
----- Current SQL Statement for this session (sql_id=4qxbkhkmkh6yc) -----
select * from t where id=99
sql_text_length=28
sql=select * from t where id=99
----- Explain Plan Dump -----
----- Plan Table -----

============
Plan Table
============ #选择了错误的执行计划
-----------------------------------------------+-----------------------------------+
| Id  | Operation                    | Name    | Rows  | Bytes | Cost  | Time      |
-----------------------------------------------+-----------------------------------+
| 0   | SELECT STATEMENT             |         |       |       |     2 |           |
| 1   |  TABLE ACCESS BY INDEX ROWID | T       |     1 |    78 |     2 |  00:00:01 |
| 2   |   INDEX RANGE SCAN           | IDX_T_ID|     1 |       |     1 |  00:00:01 |
-----------------------------------------------+-----------------------------------+
Predicate Information:
----------------------
2 - access("ID"=99)

Content of other_xml column
===========================
...

--EOF--

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值