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に対してテーブル統計を収集します。

私の質問は、mviewの行数がゼロに設定されないようにパラメータをgather_schema_statsに変更できますか?

4

1 に答える 1

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;
于 2011-09-17T17:14:03.803 に答える