-11g database ha introdotto le statistiche incrementali che raccolgono nuove funzionalità
-Le statistiche incrementali funzioneranno solo per le tabelle partizionate in cui le statistiche globali vengono aggiornate in modo incrementale eseguendo la scansione solo delle partizioni che sono state modificate dall'ultima esecuzione. Generalmente le partizioni più recenti sono quelle in cui vengono inseriti i dati e per lo più le partizioni più vecchie rimangono intatte. Con l'abilitazione delle statistiche incrementali su una tabella, solo su quelle partizioni le statistiche vengono raccolte in cui sono presenti DML, i rimanenti non vengono scansionati, il che farebbe risparmiare molto tempo.
-Le tabelle partizionate sono grandi e se abbiamo bisogno di raccogliere regolarmente statistiche su questo, sarebbe molto dispendioso in termini di tempo e la raccolta di statistiche incrementali riduce il tempo necessario per raccogliere le statistiche
Esempio di funzionalità di raccolta statistica incrementale Oracle 11g in Oracle E-Business Suite.
Prendiamo l'esempio di xla_ae_lines che è una tabella delle partizioni e ha molti record in un'istanza ERP molto utilizzata
Test case senza impostare la preferenza incrementale
-Crea una tabella xla_ae_lines_bkp come tabella delle partizioni per eseguire questo test case
– Inserisci i dati dalla tabella xla_ae_lines
inserisci in xla.xla_Ae_lines_bkp seleziona * da xla.xla_ae_lines;
2119409 righe create. |
-impostare il tempo sul cronometraggio su
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP'); Procedura PL/SQL completata con successo. Elapsed:00:00:49.06 |
- Ci sono voluti 49,06 secondi per raccogliere le statistiche per la prima volta dopo l'inserimento dei dati.
- Controlla le statistiche e il livello globale e di partizione
select table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tables dove table_name come 'XLA_AE_LINES_BKP';
TABLE_NAME ultimo_analizzato —————————— ————————— XLA_AE_LINES_BKP 09-SEP-16 10:04:34
select partition_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tab_partitions dove nome_tabella come "XLA_AE_LINES_BKP"; PARTITION_NAME last_analyzed —————————— ————————— AP 09-SET-16 10:04:15 AR 09-SET-16 10:04:16 CE 09-SET-16 10:04:16 CST 09-SEP-16 10:04:23 DPP 09-SEP-16 10:04:23 DIVERTIMENTO 09-SET-16 10:04:23 FV 09-SET-16 10:04:23 GMF 09-SEP-16 10:04:23 CIG 09-SET-16 10:04:23 IGI 09-SET-16 10:04:23 LNS 09-SEP-16 10:04:23 OFA 09-SET-16 10:04:23 OKL 09-SET-16 10:04:23 OZF 09-SEP-16 10:04:23 PA 09-SET-16 10:04:24
|
- Elimina i dati da una delle partizioni per verificare come vengono calcolate le statistiche
elimina da xla.xla_ae_lines_bkp dove application_id=222; |
- Raccolta delle statistiche usign fnd_Stats
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP');
Procedura PL/SQL completata con successo.
Trascorso:00:00:25.06 - Dopo aver eliminato i dati, è stata eseguita la raccolta delle statistiche senza impostare la preferenza. Ci sono voluti 25,06 secondi
- Controllo delle statistiche globali e delle partizioni
select table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tables dove table_name come 'XLA_AE_LINES_BKP';
TABLE_NAME last_analyzed —————————— ————————— XLA_AE_LINES_BKP 09-SEP-16 10:20:26 select partition_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tab_partitions dove nome_tabella come "XLA_AE_LINES_BKP"; PARTITION_NAME last_analyzed —————————— ————————— AP 09-SET-16 10:20:14 AR 09-SET-16 10:20:14 CE 09-SET-16 10:20:14 CST 09-SEP-16 10:20:15 DPP 09-SEP-16 10:20:15 DIVERTIMENTO 09-SET-16 10:20:15 FV 09-SET-16 10:20:15 GMF 09-SEP-16 10:20:15 CIG 09-SET-16 10:20:15 IGI 09-SET-16 10:20:15 LNS 09-SEP-16 10:20:16 OFA 09-SET-16 10:20:16 OKL 09-SET-16 10:20:16 OZF 09-SET-16 10:20:16 PA 09-SET-16 10:20:17
|
NOTA :le statistiche vengono raccolte su tutte le partizioni anche se vengono eliminati solo i dati della partizione AR, last_analyzed viene aggiornato per tutte le partizioni
Test case con impostazione della preferenza incrementale
- Elimina e ricrea la tabella xla_ae_lines_bkp come tabella delle partizioni per eseguire questo test case
- Inserisci dati dalla tabella xla_ae_lines
inserisci in xla.xla_Ae_lines_bkp seleziona * da xla.xla_ae_lines;
2119409 righe create. |
-impostare il tempo sul cronometraggio su
exec dbms_stats.set_table_prefs('XLA','XLA_AE_LINES_BKP','INCREMENTAL','TRUE'); |
- Verifica se la preferenza è impostata
select dbms_stats.get_prefs('INCREMENTAL','XLA','XLA_AE_LINES_BKP') da dual;
DBMS_STATS.GET_PREFS('INCREMENTALE','XLA','XLA_AE_LINES_BKP') ————————————————————— VERO |
- Raccogli statistiche dopo aver impostato la preferenza.
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP');
Procedura PL/SQL completata con successo. Trascorso:00:00:25.91 |
- Dopo aver impostato la preferenza, sono stati necessari 25,91 secondi per raccogliere le statistiche per la prima volta dopo l'inserimento dei dati
- controllo delle informazioni sui tempi delle statistiche
select table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tables dove table_name come 'XLA_AE_LINES_BKP';
TABLE_NAME last_analyzed —————————— ————————— XLA_AE_LINES_BKP 09-SEP-16 10:35:32 select partition_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tab_partitions dove nome_tabella come "XLA_AE_LINES_BKP"; 18
PARTITION_NAME last_analyzed —————————— ————————— AP 09-SET-16 10:35:30 AR 09-SET-16 10:35:12 CE 09-SET-16 10:35:10 CST 09-SEP-16 10:35:21 DPP 09-SEP-16 10:35:21 DIVERTIMENTO 09-SET-16 10:35:12 FV 09-SET-16 10:35:10 GMF 09-SEP-16 10:35:10 CIG 09-SET-16 10:35:10 IGI 09-SET-16 10:35:12 LNS 09-SEP-16 10:35:10 OFA 09-SET-16 10:35:10 OKL 09-SET-16 10:35:12 OZF 09-SET-16 10:35:30 PA 09-SET-16 10:35:12
|
- Eliminare i dati da una partizione per vedere come la raccolta di statistiche incrementali aiuterà la prossima volta che verranno raccolte le statistiche.
elimina da xla_ae_lines_bkp dove application_id=222;
100233 righe eliminate |
- Raccogli statistiche dopo aver eliminato i dati dalla partizione application_id 222 AR
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP');
Procedura PL/SQL completata con successo. Trascorso:00:00:4.11 |
- Dopo aver eliminato i dati per una partizione, la raccolta incrementale delle statistiche ha richiesto 4,11 secondi
- Controlla le statistiche globali e di partizione
select table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tables dove table_name come 'XLA_AE_LINES_BKP';
TABLE_NAME last_analyzed —————————— ————————— XLA_AE_LINES_BKP 09-SEP-16 10:45:18 select partition_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" da dba_Tab_partitions dove ta ble_name come 'XLA_AE_LINES_BKP'; PARTITION_NAME last_analyzed —————————— ————————— AP 09-SET-16 10:35 :30 AR 09-SET-16 10:45:18 CE 09-SET-16 10:35 :10 CST 09-SEP-16 10:35 :21 DPP 09-SEP-16 10:35 :21 DIVERTIMENTO 09-SET-16 10:35 :12 FV 09-SET-16 10:35 :10 GMF 09-SEP-16 10:35 :10 CIG 09-SET-16 10:35 :10 IGI 09-SET-16 10:35 :12 LNS 09-SEP-16 10:35 :10 OFA 09-SET-16 10:35 :10 OKL 09-SET-16 10:35 :12 OZF 09-SET-16 10:35 :30 PA 09-SET-16 10:35 :12
|
Cose importanti da notare, le statistiche vengono raccolte, la data dell'ultima_analisi è stata modificata solo per la partizione AR e anche i tempi sono stati ridotti.
Quindi vediamo che la raccolta di statistiche incrementali riduce i tempi di raccolta delle statistiche e può essere molto utile per tabelle di partizioni di grandi dimensioni.