Statistik kan blive forældet, når dataene i tabellen ændres væsentligt. Ajourførte statistikker er vigtige for at generere gode eksekveringsplaner
Hvordan Oracle beslutter, om statistikken er blevet forældet
Statistik betragtes som forældet, når #(INSERTS + UPDATES + DELETES)>=10 % af NUM_ROWS fra dba_tables:
Parameterindstilling påkrævet for at spore tabelændringerne
Før Oracle 10g blev den automatiske indsamling af statistik for objekter, der var blevet forældede, kontrolleret af indstillingen af MONITORING-flaget på bordet.
Afhængigt af MONITORING-flaget indsamlede GATHER_STATS_JOB-jobbet "GATHER EMPTY" og "SATHER STALE" på de markerede objekter.
I 10g er nøgleordene MONITORING og NOMONITORING forældet og vil blive ignoreret. Funktionen til tabelovervågning styres nu af parameteren STATISTICS_LEVEL.
Når STATISTICS_LEVEL er sat til BASIC, er overvågning deaktiveret i tabellen.
Når STATISTICS_LEVEL er indstillet til TYPICAL, er overvågning aktiveret.
Som standard er STATISTICS_LEVEL indstillet til TYPICAL, og overvågning af tabeller er aktiveret. Det anbefales kraftigt at indstille STATISTICS_LEVEL til TYPICAL i 10g og derover
Ved at indstille disse parameter sporer Oracle det omtrentlige antal INSERT-, UPDATE- og DELETE-operationer for oracle-tabellen siden sidste gang, der blev indsamlet statistik. Denne information om "foretagne ændringer" vedligeholdes i SGA og periodisk (ca. hvert 15. minut) skyller SMON dataene ind i dataordbogstabellerne. Du kan tømme oplysningerne manuelt ved at kalde dbms_stats.FLUSH_DATABASE_MONITORING_INFO(). Dataordbogsoplysningerne gøres synlige gennem visningerne:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS og USER_TAB_MODIFICATIONS.
Oracle bruger disse visninger til at identificere tabeller, der har forældede statistikker.
Når der er 10 % ændring i data i en tabel, anser Oracle sin statistik for at være forældet.
Sådan tjekker du forældede statistikker
Nedenstående PLSQL-procedure finder ud af alle tabellerne i SCOTT-skemaet, som er forældet statistik
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname=>'SCOTT', objlist=>ObjList, options=>'LIST STALE'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Nedenstående sql kan også bruges til at finde ud af indsæt, opdateringer, sletter
select u.TIMESTAMP, t.last_analyzed, u.table_name, u.inserts, u.updates, u.deletes, d.num_rows, decode(d.num_rows,0,'Table Stats indicate No Rows', nvl(TO_CHAR(((U.inserts+u.deletes+u.updates)/d.num_rows) * 100,'999.99') ,'Null Value in USER_TAB_MODIFICATIONS') ) percent from user_tables t,USER_TAB_MODIFICATIONS u,dba_tables d where u.table_name = t.table_name and d.table_name = t.table_name and d.owner = '&Owner' and (u.inserts > 3000 or u.updates > 3000 or u.deletes > 3000) order by t.last_analyzed /
Hvis du vil køre dette på hele databasen
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST STALE'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Hvis du vil se tabellerne, hvor statistik er tomme, kan vi bruge nedenfor
SET SERVEROUTPUT ON SQL> DECLARE ObjList dbms_stats.ObjectTab; BEGIN DBMS_STATS.GATHER_DATABASE_STATS(objlist=>ObjList, options=>'LIST EMPTY'); FOR k in ObjList.FIRST..ObjList.LAST LOOP dbms_output.put_line(ObjList(k).ownname || '.' || ObjList(k).ObjName || ' ' || ObjList(k).ObjType || ' ' || ObjList(k).partname); END LOOP; END; /
Når du nu har fundet tabellisten, kan du generere statistik om disse tabeller.
exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');
Vi kan også køre under kommandoen for at generere statistik på alle de forældede objekter i skemaet
exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');
Startende med Oracle11g kan staleness-tærsklen indstilles ved hjælp af STALE_PERCENT-statistikpræferencen. Dette kan indstilles globalt ved hjælp af DBMS_STATS.SET_GLOBAL_PREFS eller på tabelniveau ved hjælp af DBMS_STATS.SET_TABLE_PREFS.
Relaterede artikler
ora-38029:objektstatistikker er låst
ora-20001 i Indsaml skemastatistik på 11g(FND_HISTOGRAM_COLS)
Indsamling af statistik i Release 11i og R12
Inkrementel statistik indsamling i 11g
Sådan sæt tabelovervågning i Oracle og relationer med STATISTICS_LEVEL