Oracle 统计量NO_INVALIDATE参数配置(三)

2014-11-24 17:24:19 · 作者: · 浏览: 5
S VERSION_COUNT FIRST_LOAD_TIME


------------- ---------- ------------- -------------------


cnb0ktgvms6vq 1 1 2014-01-06/00:04:29



注意:在相同的sql_id情况下,version_count和executions都为1。Executions是不可能减少的。所以,这个父游标是新生成的!


此时,执行计划如下:



SQL> select * from table(dbms_xplan.display_cursor(sql_id=>'cnb0ktgvms6vq'));


PLAN_TABLE_OUTPUT


--------------------------------------------------------------------------------

SQL_ID cnb0ktgvms6vq, child number 0


-------------------------------------


select /*+demo*/object_id, owner from t where object_id=1000


Plan hash value: 1601196873


--------------------------------------------------------------------------


| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |


--------------------------------------------------------------------------


| 0 | SELECT STATEMENT | | | | 266 (100)| |


|* 1 | TABLE ACCESS FULL| T | 72722 | 639K| 266 (1)| 00:00:04 |


--------------------------------------------------------------------------


Predicate Information (identified by operation id):


---------------------------------------------------


1 - filter("OBJECT_ID"=1000)



18 rows selected



这也就是说明了,新的执行计划已经生成了!也就是原有的游标被废弃。


结论:当我们收集统计量使用no_invalidate为false的时候,原有的共享游标被失效,下一次在执行SQL的时候,Oracle会重新为其生成执行计划,也就是一次hard parse过程。

True和false取值是比较简单的。我们接下来讨论dbms_stats.auto_invalidate取值情况。