2013-05-05 18 views
12

C'è un modo per aggiornare tutte le statistiche per tutte le tabelle indipendentemente dal proprietario?Oracle aggiorna manualmente le statistiche su tutte le tabelle

Ho trovato questo sniplet, ma non sono sicuro se questo catturerà tutti i tavoli ....

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; 
+1

SELECT DISTINCT proprietario DA SYS.all_tables –

risposta

7

No il pacchetto DBMS_STATS può fare al massimo uno schema alla volta.

È possibile utilizzare lo script seguente per raccogliere le statistiche per tutti i tipi di oggetti in tutti gli schemi. Quello che hai elencato ha un paio di problemi (l'esecuzione immediata non necessaria, `A.owner 'è una stringa ma dovrebbe essere un oggetto, ecc.).

È possibile aggiungere schemi aggiuntivi da saltare nell'elenco IN poiché probabilmente non si desidera eseguire ciò per gli schemi incorporati (sono comunque statici in ogni caso, quindi sarebbe inutile). Inoltre, è necessario disporre dei privilegi appropriati per ogni schema su cui si stanno raccogliendo le statistiche (o essere registrati come DBA).

Raccogliere statistiche su tutti gli oggetti (probabilmente quello che si vuole veramente):

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; 

Raccogliere statistiche solo su tabelle:

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; 
13
+3

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – SysDragon

+2

@SysDragon La mia risposta era sia una funzione che un collegamento. Ho aggiunto un 'exec' e'; 'per renderlo più chiaro. –

+0

E come previsto, il collegamento è rotto. –

Problemi correlati