sql >> Databasteknik >  >> RDS >> Oracle

Hur man kontrollerar inaktuell statistik

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


  1. Salesforce SOQL från Apache OpenOffice

  2. Vad våra kunder förtjänar:Vi introducerar MariaDB Enterprise Documentation

  3. Ansluta IBM DB2 med IRI Software

  4. Tips för läs-/skrivlås beroende på transaktionsisoleringsnivå i MSSQL