sql >> Database teknologi >  >> RDS >> Oracle

Sådan tjekker du gammel statistik

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


  1. Hvornår skal jeg bruge et sammensat indeks?

  2. OPDATERE flere tabeller i MySQL ved hjælp af LEFT JOIN

  3. SQL Server - definerer en XML-type kolonne med UTF-8-kodning

  4. MySQL DROP DATABASE