我们使用以下内容刷新给定模式中所有表的统计信息:
exec dbms_stats.gather_schema_stats(ownname => 'some_schema', estimate_percent => dbms_stats.auto_sample_size, cascade => true, method_opt => 'FOR ALL COLUMNS SIZE AUTO', degree => 12);
但是,这会将物化视图的行计数设置为零,并且会产生不必要的副作用,导致查询物化视图的查询计划效率低下 . 我们通过在模式统计信息运行后针对特定mviews收集表统计信息来解决此问题 .
我的问题是:我可以以任何方式将参数更改为gather_schema_stats,这会导致mview行计数不能设置为零吗?
1 回答
你不能告诉
GATHER_SCHEMA_STATS
排除某些对象 . 您可以执行GATHER STALE
仅收集统计信息过时的对象的统计信息,但完全可能包含物化视图 . 解决这个问题的几种方法1)使用
LOCK_TABLE_STATS
过程锁定物化视图的统计信息 . 这将阻止GATHER_SCHEMA_STATS
收集有关这些对象的统计信息,直到您调用UNLOCK_TABLE_STATS
过程(可能是作为定期刷新物化视图统计信息的过程的一部分) .2)在收集模式统计信息之前使用
EXPORT_TABLE_STATS
过程保存物化视图的统计信息,然后在GATHER_SCHEMA_STATS
调用完成后调用RESTORE_TABLE_STATS
以返回物化视图统计信息 .3)不要使用
GATHER_SCHEMA_STATS
. 在循环中调用GATHER_TABLE_STATS
,在其中排除所需的任何对象 . 就像是