收集模式统计信息时,包含物化视图的统计信息。

3
我们使用以下方法刷新给定模式中所有表的统计信息:
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);

然而,这会将我们的物化视图的行数设置为零,并导致针对这些物化视图的查询计划效率低下的副作用。我们通过在模式统计信息运行后针对特定mview收集表统计信息来解决这个问题。

我的问题是:我能否以任何方式更改gather_schema_stats的参数,以使mview行数不被设置为零?


这个问题可能更适合在dba.stackexchange.com上提问。 - Codo
1个回答

3
您不能告诉 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。像这样:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接