web-dev-qa-db-ja.com

Oracleはすべてのテーブルの統計を手動で更新します

所有者に関係なく、すべてのテーブルのすべての統計を更新する方法はありますか?

このスニペットを見つけましたが、これがすべてのテーブルを取得するかどうかはわかりません。

BEGIN
   FOR A IN ( SELECT owner FROM SYS.all_tables ) LOOP
      execute immediate
        EXEC dbms_stats.gather_schema_stats( 'A.owner', cascade='TRUE');
   END LOOP;
END;
17
Tom
16
Jon Heller

いいえ DBMS_STATS パッケージは、一度に1つのスキーマしか実行できません。

以下のスクリプトを使用して、すべてのスキーマのすべてのオブジェクトタイプの統計を収集できます。リストしたものにはいくつか問題があります(即時実行不要、「A.owner」は文字列ですが、オブジェクトである必要があります)。

追加のスキーマを追加して、INリストでスキップできます。これは、おそらく組み込みスキーマに対してこれを行いたくないためです(これらはほとんど静的であるため、無駄になります)。また、統計を収集している(またはDBAとしてログインしている)スキーマごとに適切な特権を持っている必要があります。

すべてのオブジェクトの統計を収集します(おそらく本当に必要なもの):

BEGIN
    FOR rec IN (SELECT * 
                FROM all_users
                WHERE username NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_schema_stats(rec.username);
    END LOOP;
END;

テーブルのみの統計を収集します。

BEGIN
    FOR rec IN (SELECT * 
                FROM all_tables
                WHERE owner NOT IN ('SYS','SYSDBA'))
    LOOP
        dbms_stats.gather_table_stats(rec.owner, rec.table_name);
    END LOOP;
END;
10
sehrope