我们使用以下内容刷新给定模式中所有表的统计信息:
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行计数不能设置为零吗?
答案 0 :(得分:3)
您无法告诉GATHER_SCHEMA_STATS
排除某些对象。您可以执行GATHER STALE
仅收集统计信息过时的对象的统计信息,但完全可能包含物化视图。解决这个问题的几种方法
1)使用LOCK_TABLE_STATS
过程锁定物化视图的统计信息。这将阻止GATHER_SCHEMA_STATS
收集有关这些对象的统计信息,直到您调用UNLOCK_TABLE_STATS
过程(可能是定期刷新物化视图统计信息的过程的一部分)。
2)在收集架构统计信息之前,使用EXPORT_TABLE_STATS
过程保存实例化视图的统计信息,然后在RESTORE_TABLE_STATS
调用完成后调用GATHER_SCHEMA_STATS
以返回实例化视图统计信息。
3)不要使用GATHER_SCHEMA_STATS
。在循环中调用GATHER_TABLE_STATS
,您可以在其中排除所需的任何对象。像
BEGIN
FOR x IN (SELECT *
FROM dba_tables
WHERE owner = 'SOME_SCHEMA'
AND table_name NOT IN (<<list of MVs>>))
LOOP
dbms_stats.gather_table_stats( x.owner, x.table_name, ... );
END LOOP;
END;