TABLE ACCESS BY INDEX ROWID| TABTEMP | 1 | 97 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TABTEMP_ID | 1 | | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_ID"=3)
由输出结果可知,本次查询沿用原来的执行计划,是错误的执行计划。
重新对更新后的测试对象进行数据分析:
SQL> set autotrace off;
SQL> exec dbms_stats.gather_table_stats(user,'TABTEMP',cascade=>true);
查看收集统计数据后的执行计划:
SQL> set autotrace trace exp;
SQL> select * from tabtemp where object_id=3;
Execution Plan
----------------------------------------------------------
Plan hash value: 3955501171
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 72757 | 6749K| 293 (2)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| TABTEMP | 72757 | 6749K| 293 (2)| 00:00:04 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OBJECT_ID"=3)
由输出可知,本次查询使用了正确的执行计划。所以,要注意在实际生产环境中对表、索引等进行及时有效的统计数据收集工作,避免因此带来性能问题。
SQL> alter session set events '10053 trace name context off';
SQL> select value from v$diag_info where name='Default Trace File';
VALUE
------------------------------------------------------------------------------
c:\app\administrator\diag\rdbms\orcl11g\orcl11g\trace\orcl11g_ora_5952_plan.trc
4、分析10053事件trace文件中CBO出错的位置
#more orcl11g_ora_5952_plan.trc
在前面模拟中有如下操作:
SQL> update tabtemp set object_id=3 where object_id!=3;
72763 rows updated.
SQL> commit;
SQL> select count(distinct object_id) from tabtemp;
COUNT(DISTINCTOBJECT_ID)
------------------------
1
SQL> select * from tabtemp where object_id=3; 此处没有重新进行统计信息收集,直接发起查询。
查看10053trace文件中相对应的内容:
***************************************
BASE STATISTICAL INFORMATION
***********************
Table Stats::
Table: TABTEMP Alias: TABTEMP
#Rows: 72764 #Blks: 1062 AvgRowLen: 97.00
Index Stats::
Index: IDX_TABTEMP_ID Col#: 4
LVLS: 1 #LB: 161 #DK: 72764 LB/K: 1.00 DB/K: 1.00 CLUF: 1102.00
Access path analysis for TABTEMP
***************************************
SINGLE TABLE ACCESS PATH
Single Table Cardinality Estimation for TABTEMP[TABTEMP]
Table: TABTEMP Alias: TABTEMP
Card: Original: 72764.000000 Rounded: 1 Computed: 1.00 Non Adjusted: 1.00
Access Path: TableScan
Cost: 291.18 Resp: 291.18 Degree: 0
Cost_io: 289.00 Cost_cpu: 26481829
&