------------- ---------- ------------- -------------------
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取值情况。