首页 文章

收集物化视图的统计信息,作为gather_schema_stats的一部分

提问于
浏览
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);

但是,这会将物化视图的行计数设置为零,并且会产生不必要的副作用,导致查询物化视图的查询计划效率低下 . 我们通过在模式统计信息运行后针对特定mviews收集表统计信息来解决此问题 .

我的问题是:我可以以任何方式将参数更改为gather_schema_stats,这会导致mview行计数不能设置为零吗?

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;
    

相关问题