Come detto negli altri due post per eliminare le statistiche di tipo STALE occorre ricalcolarle.
Purtroppo non è detto che la tabella a livello globale risulti essere NO STALE una volta ricompilate le partizioni e/o le sottopartizioni, occorre quindi esplicitamente effettuare il calcolo delle statistiche della tabella.
A questo punto uno può dire ma le ho fatte prima le statistiche che faccio come i cani che ricorrono la propria coda?
No mentre prima le statistiche erano state fatte a livello di partizioni e sottopartizioni in questo caso devono essere eseguite a livello Globale.
Di seguito come individuarle e come eseguirle:
for t in (
SELECT C.OWNER,C.TABLE_NAME
FROM
(SELECT A.OWNER,A.TABLE_NAME ,A.SAMPLE_SIZE
FROM DBA_TAB_STATISTICS A,DBA_TABLES B
WHERE A.OWNER=v_owner AND A.STALE_STATS='YES'
AND A.OWNER=B.OWNER AND A.TABLE_NAME=B.TABLE_NAME
AND B.PARTITIONED='YES' AND A.OBJECT_TYPE='TABLE') C,
DBA_TAB_STATISTICS D
WHERE C.OWNER=D.OWNER AND C.TABLE_NAME=D.TABLE_NAME
AND C.TABLE_NAME = <v_table_name> AND D.OBJECT_TYPE='PARTITION'
GROUP BY C.OWNER,C.TABLE_NAME
)loop
v_cmd:='BEGIN DBMS_STATS.GATHER_TABLE_STATS(
OwnName => :v_owner,
TabName => :x_table_name,
Granularity => ''GLOBAL'',
Degree => 2,
Cascade => TRUE);
END;';
dbms_output.put_line('TABLE_NAME:'||x.table_name);
execute immediate v_cmd using in t.owner,t.table_name;
end loop;
In questo modo eseguiamo le statistiche su tutte le tabelle partizionate/sottopartizionate.
Nessun commento:
Posta un commento