所有者に関係なく、すべてのテーブルのすべての統計を更新する方法はありますか?
このスニペットを見つけましたが、これがすべてのテーブルを取得するかどうかはわかりません。
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;
いいえ 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;