2011-09-17 76 views
3

的一部分,我们使用以下方法来刷新在给定模式的所有表的统计信息:收集关于物化视图的统计数据gather_schema_stats

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

这个问题可能是更好的问[dba.stackexchange.com](http://dba.stackexchange.com/)。 – Codo

回答

3

你不能告诉GATHER_SCHEMA_STATS排除某些对象。您可以执行GATHER STALE来收集统计数据过时的对象的统计信息,但完全可能包含您的物化视图。一些方法可以解决该问题

1)使用LOCK_TABLE_STATS过程来锁定实例化视图的统计信息。这将阻止GATHER_SCHEMA_STATS收集这些对象的统计信息,直到您调用UNLOCK_TABLE_STATS过程(可能作为定期刷新物化视图统计信息的过程的一部分)。

2)使用EXPORT_TABLE_STATS程序收集模式统计之前保存的物化视图的统计数据,然后调用RESTORE_TABLE_STATSGATHER_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; 
+1

非常感谢。我没有听说过lock_table_stats。事实证明,这不是gather_schema_stats,它正在重置mview统计信息。它是dbms_snapshot.refresh。我们只会在任何刷新之前锁定mview统计信息。 – grenade