Statistik kan bli inaktuell när data i tabellen ändras väsentligt. Uppdaterad statistik är viktig för att skapa bra genomförandeplaner
Hur Oracle avgör om statistiken har blivit inaktuell
Statistik anses vara inaktuell när #(INSERTS + UPPDATERINGAR + DELETES)>=10 % av NUM_ROWS från dba_tables:
Parameterinställning krävs för att spåra tabelländringarna
Före Oracle 10g kontrollerades automatiserad insamling av statistik för objekt som hade blivit inaktuella av inställningen av MONITORING-flaggan på tabellen.
Beroende på MONITORING-flaggan samlade GATHER_STATS_JOB-jobbet "GATHER EMPTY" och "SATHER STALE" på de flaggade objekten.
I 10g är nyckelorden MONITORING och NOMONITORING utfasade och kommer att ignoreras. Funktionen för tabellövervakning styrs nu av parametern STATISTICS_LEVEL.
När STATISTICS_LEVEL är inställt på BASIC, är övervakning inaktiverad i tabellen.
När STATISTICS_LEVEL är inställd på TYPICAL, är övervakning aktiverad.
Som standard är STATISTICS_LEVEL inställd på TYPICAL och övervakning av tabeller är aktiverad. Det rekommenderas starkt att ställa in STATISTICS_LEVEL till TYPICAL i 10g och högre
Genom att ställa in dessa parameter spårar Oracle det ungefärliga antalet INSERT-, UPDATE- och DELETE-operationer för Oracle-tabellen sedan senaste gången statistik samlades in. Denna information om "gjorda ändringar" behålls i SGA och regelbundet (ungefär var 15:e minut) spolar SMON data in i datalexikonstabellerna. Du kan tömma informationen manuellt genom att anropa dbms_stats.FLUSH_DATABASE_MONITORING_INFO(). Informationen i datalexikonet görs synlig genom vyerna:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS och USER_TAB_MODIFICATIONS.
Oracle använder dessa vyer för att identifiera tabeller som har inaktuell statistik.
När det sker 10 % förändring av data i en tabell, anser Oracle att dess statistik är inaktuell.
Hur man kontrollerar gammal statistik
PLSQL-proceduren nedan tar reda på alla tabeller i SCOTT-schemat som är inaktuell 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; /
Nedanstående sql kan också användas för att ta reda på infoga, uppdateringar, raderingar
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 /
Om du vill köra detta på hela 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; /
Om du vill se tabellerna där statistiken är tom kan vi använda nedan
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; /
Nu när du hittar tabelllistan kan du generera statistik om dessa tabeller.
exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');
Vi kan också köra under kommandot för att generera statistik för alla inaktuella objekt i schemat
exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');
Från och med Oracle11g kan staleness-tröskeln ställas in med statistikinställningen STALE_PERCENT. Detta kan ställas in globalt med DBMS_STATS.SET_GLOBAL_PREFS eller på tabellnivå med DBMS_STATS.SET_TABLE_PREFS.
Relaterade artiklar
ora-38029:objektstatistik är låst
ora-20001 i Samla schemastatistik på 11g(FND_HISTOGRAM_COLS)
Samlar statistik i release 11i och R12
Inkrementell statistik samlas in på 11g
Hur man ställ in tabellövervakning i Oracle och relation med STATISTICS_LEVEL