it-swarm.com.de

Oracle aktualisiert die Statistiken für alle Tabellen manuell

Gibt es eine Möglichkeit, alle Statistiken für alle Tabellen unabhängig vom Eigentümer zu aktualisieren?

Ich habe dieses Sniplet gefunden, bin mir aber nicht sicher, ob es alle Tische packt ...

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

Nein das DBMS_STATS package kann höchstens ein Schema gleichzeitig ausführen.

Sie können das folgende Skript verwenden, um Statistiken für alle Objekttypen in allen Schemata zu erfassen. Die von Ihnen aufgeführte hat ein paar Probleme (unnötig sofort ausführen, "A.owner" ist eine Zeichenfolge, sollte aber ein Objekt sein, usw.).

Sie können zusätzliche Schemas hinzufügen, die in der Liste IN übersprungen werden sollen, da Sie dies wahrscheinlich nicht für die eingebauten Schemas tun möchten (sie sind sowieso meistens statisch, es wäre also Verschwendung). Außerdem müssen Sie über die entsprechenden Berechtigungen für jedes Schema verfügen, für das Sie Statistiken erfassen (oder als DBA angemeldet sein).

Sammle Statistiken zu allen Objekten (wahrscheinlich was du wirklich willst):

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;

Sammeln Sie Statistiken nur auf Tischen:

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