Come raccogliere statistiche in EBS
- Per utilizzare l'ottimizzatore basato sui costi in modo efficace, le statistiche dello schema devono essere aggiornate. Fortunatamente, Oracle EBS ha fornito alcuni script e programmi simultanei (Gather Schema Statistics e Gather Table Statistics) per semplificare questa attività amministrativa. FND_STATS è un pacchetto PL/SQL per le applicazioni che dispone di numerose funzioni che aiuteranno in questo compito amministrativo. Questo pacchetto può essere invocato da un programma simultaneo seminato o direttamente da SQL*Plus.
- Non è consigliabile utilizzare DBMS_STATS con il database delle app Oracle.
- Quando si utilizza il programma simultaneo "Gather Schema Statistics", si consiglia di passare solo il parametro del nome dello schema e di lasciare che gli altri parametri tornino ai valori predefiniti. Il nome dello schema passato può essere un nome schema specifico (ad es. GL) o "ALL" se preferisci raccogliere statistiche CBO per i moduli Apps. Questa scelta utilizza il metodo “stima” con una dimensione campionaria del 10% (predefinito).
- Quando si utilizza il programma simultaneo "Gather Table Statistics", passare solo il proprietario della tabella (nome dello schema) e il nome della tabella. Lascia che tutti gli altri parametri siano predefiniti automaticamente, tranne quando la tabella è una tabella partizionata.
Per eseguire manualmente FND_STATS da SQL*Plus per raccogliere statistiche CBO per uno o tutti gli schemi o per una tabella particolare, utilizza la seguente sintassi:
Per raccogliere statistiche per uno schema particolare
exec fnd_stats.gather_schema_statistics('AP');
Per raccogliere statistiche per TUTTI gli schemi nel database
exec fnd_stats.gather_schema_statistics('ALL');
Per raccogliere statistiche per una tabella particolare
exec fnd_stats.gather_table_stats('GL','GL_JE_LINES');
Altri comandi
exec apps.fnd_stats.GATHER_TABLE_STATS('GL','GL_POSTING');
Per raccogliere statistiche al 10%
exec apps.fnd_stats.GATHER_TABLE_STATS('QP','QP_LIST_HEADERS_TL',10);
Per raccogliere statistiche al 30%
exec apps.fnd_stats.GATHER_TABLE_STATS('CSM','CSM_MTL_SYSTEM_ITEMS_ACC',35);
Per raccogliere statistiche al 25% con 4 lavoratori in parallelo
exec apps.fnd_stats.GATHER_TABLE_STATS('ONT','OE_TRANSACTION_TYPES_ALL',25,4);
Per raccogliere statistiche con auto_sample_size
exec apps.fnd_stats.GATHER_TABLE_STATS('HR','PAY_RUN_BALANCES',dbms_stats.auto_sample_size);
Comandi simili
exec apps.fnd_stats.GATHER_TABLE_STATS('HR','PAY_PAYROLL_ACTIONS',10,4); exec apps.fnd_stats.GATHER_TABLE_STATS('HR',HR_CODES',35); exec apps.fnd_stats.GATHER_TABLE_STATS('CS','CS_INCIDENT_TYPE_TL'); exec apps.fnd_stats.GATHER_SCHEMA_STATS('GL',25);
Con il database 11g e 12c, si consiglia di iniziare a utilizzare GATHER AUTO e AUTO SAMPLE SIZE per raccogliere le statistiche
Questo può essere fatto anche tramite richiesta simultanea o tramite sql
Raccogli per lo schema APPLSYS:
exec apps.fnd_stats.gather_schema_statistics(schemaname=> 'APPLSYS',estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE ,options => 'GATHER AUTO');
Raccogli per TUTTI gli schemi:(puoi o meno volerlo fare)
exec apps.fnd_stats.gather_schema_statistics(schemaname=> 'ALL',estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE ,options => 'GATHER AUTO');
Questo funziona abbastanza più velocemente rispetto ad altri sopra ed è anche molto preciso. È più veloce in quanto genera statistiche solo per gli oggetti obsoleti e anche con la dimensione del campione automatico
Se vuoi conoscere i tempi di raccolta delle statistiche che hanno assunto lo schema, possiamo utilizzare la query di seguito
select owner, min(last_analyzed) , max(last_analyzed) ,( max(last_analyzed) - min(last_analyzed))*24 hours_took from dba_tables where last_analyzed is not null and trunc (last_analyzed) = '&enter_date_DD-MON-YY' -- Example : '01-APR-19' group by owner order by hours_took ;
Raccolta delle statistiche di sistema con 11i e R12
Per E-Business Suite, per database non Exadata, si consiglia di raccogliere le statistiche di sistema con l'opzione NOWORKLOAD, come in:
execute DBMS_STATS.GATHER_SYSTEM_STATS (gathering_mode => 'NOWORKLOAD');
Ma per il database Exadata usa invece il seguente comando:
execute DBMS_STATS.GATHER_SYSTEM_STATS ('EXADATA');
In genere, questa operazione deve essere eseguita solo una volta dopo eventuali modifiche importanti all'architettura apportate al DB.
Raccolta delle statistiche del dizionario con 11i e R12
- Devi avere il privilegio di sistema SYSDBA (o entrambi ANALYZE ANY DICTIONARY e ANALYZE ANY) per eseguire questa procedura.
execute dbms_stats.gather_schema_stats(''SYS'', method_opt=>''for all columns size 1'', degree=>30,estimate_percent=>100,cascade=>true);
- Se stai utilizzando la versione del database 10g/11g, puoi invece utilizzare la seguente sintassi
execute dbms_stats.gather_dictionary_stats ();
- Questa procedura raccoglierà statistiche per tutti gli schemi di sistema, inclusi SYS e SYSTEM, e altri schemi opzionali, come CTXSYS e DRSYS.
- In genere, questa operazione deve essere eseguita solo una volta dopo eventuali modifiche importanti all'architettura apportate al DB.
Questo conclude i passaggi per la raccolta di statistiche dell'ottimizzatore nell'ambiente Oracle EBS. Spero ti piaccia il post su Gather Schema Statistics utilizzando FND_STATS in EBS 11i e R12
Legge anche
Oracle simultanea Manager
Suggerimenti per l'ottimizzazione
https://docs.oracle.com/cd/E18727_01/doc.121/e12893/T174296T174306.htm