实际工作上用的较多的就是临时手工收集下某张表的统计信息并希望后续sql立即生成新的执行计划。方法有如下两种,推荐用dbms_stats,遇到CHAINED ROWS和CLUSTER TABLE就必须使用analyze,且analyze不受任何参数限制执行后立即会清除shared pool中该对象的游标,而dbms_stats则受参数控制。
生产环境上是不可能去执行alter system flush shared_pool以便让sql立即生成新的执行计划的
一:SQL> analyze table my_table compute statistics;
analyze table 一般可以指定分析表、所有字段、所有索引字段、所有索引。 若不指定则全部都分析。
上面语句等价于:
SQL> analyze table my_table compute statistics for table for all indexes for all columns;
二:SQL>exec dbms_stats.gather_table_stats('HR','T1',cascade=>true, no_invalidate=>FALSE);
Cascade选项:默认值是DBMS_STATS.AUTO_CASCADE。手工操作时一般时候设置为true,把索引也收集了
no_invalidate选项:默认值是DBMS_STATS.AUTO_INVALIDATE。手工操作时一般时候设置为false,让之后的sql立即生成新的执行计划。
true:当收集完统计信息后,收集对象的cursor不会失效(不会产生新的执行计划,子游标)
false:当收集完统计信息后,收集对象的cursor会立即失效(新的执行计划,新的子游标)
DBMS_STATS.AUTO_INVALIDATE:收集后,收集对象的cursor在一段时间后失效,时间受参数_optimizer_invalidation_period控制,默认是18000秒即5小时
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2120194/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30126024/viewspace-2120194/