Statistiken können veraltet sein, wenn sich die Daten in der Tabelle erheblich ändern. Aktuelle Statistiken sind wichtig, um gute Ausführungspläne zu erstellen
Wie Oracle entscheidet, ob die Statistiken veraltet sind
Statistiken gelten als veraltet, wenn #(INSERTS + UPDATES + DELETES)>=10 % von NUM_ROWS aus dba_tables:
Parametereinstellung erforderlich, um die Tabellenänderungen zu verfolgen
Vor Oracle 10g wurde die automatische Erfassung von Statistiken für veraltete Objekte durch das Setzen des MONITORING-Flags auf der Tabelle gesteuert.
Abhängig vom MONITORING-Flag erfasste der GATHER_STATS_JOB-Job „GATHER EMPTY“ und „GATHER STALE“. auf den markierten Objekten.
In 10g sind die Schlüsselwörter MONITORING und NOMONITORING veraltet und werden ignoriert. Die Tabellenüberwachungsfunktion wird jetzt durch den Parameter STATISTICS_LEVEL gesteuert.
Wenn STATISTICS_LEVEL auf BASIC gesetzt ist, ist die Überwachung für die Tabelle deaktiviert.
Wenn STATISTICS_LEVEL auf TYPICAL gesetzt ist, ist die Überwachung aktiviert.
Standardmäßig ist STATISTICS_LEVEL auf TYPICAL gesetzt und die Überwachung von Tabellen ist aktiviert. Es wird dringend empfohlen, STATISTICS_LEVEL in 10 g und darüber auf TYPICAL zu setzen.
Durch Festlegen dieser Parameter verfolgt Oracle die ungefähre Anzahl von INSERT-, UPDATE- und DELETE-Vorgängen für die Oracle-Tabelle seit der letzten Erfassung der Statistiken. Diese Informationen über „vorgenommene Änderungen“ werden in der SGA gepflegt und regelmäßig (ungefähr alle 15 Minuten) löscht der SMON die Daten in die Data-Dictionary-Tabellen. Sie können die Informationen manuell leeren, indem Sie dbms_stats.FLUSH_DATABASE_MONITORING_INFO() aufrufen. Die Datenwörterbuchinformationen werden durch die Ansichten sichtbar gemacht:DBA_TAB_MODIFICATIONS, ALL_TAB_MODIFICATIONS und USER_TAB_MODIFICATIONS.
Oracle verwendet diese Ansichten, um Tabellen mit veralteten Statistiken zu identifizieren.
Immer wenn sich die Daten in einer Tabelle um 10 % ändern, betrachtet Oracle seine Statistiken als veraltet.
So überprüfen Sie veraltete Statistiken
Die folgende PLSQL-Prozedur findet alle Tabellen im SCOTT-Schema, das veraltete Statistiken sind
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; /
Die folgende SQL kann auch verwendet werden, um Einfügungen, Aktualisierungen und Löschungen herauszufinden
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 /
Wenn Sie dies auf der gesamten Datenbank ausführen möchten
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; /
Wenn Sie die Tabellen sehen möchten, in denen die Statistik leer ist, können wir unten verwenden
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; /
Sobald Sie die Tabellenliste gefunden haben, können Sie Statistiken zu diesen Tabellen erstellen.
exec dbms_stats.gather_table_stats('OWNER', 'TABLE_NAME');
Wir können auch den folgenden Befehl ausführen, um Statistiken für alle veralteten Objekte im Schema zu generieren
exec dbms_stats.gather_schema_stats(ownname => '<schema name>', cascade => TRUE, options => 'GATHER AUTO');
Ab Oracle11g kann der Veraltungsschwellenwert mit der Statistikeinstellung STALE_PERCENT festgelegt werden. Dies kann global mit DBMS_STATS.SET_GLOBAL_PREFS oder auf Tabellenebene mit DBMS_STATS.SET_TABLE_PREFS eingestellt werden.
Verwandte Artikel
ora-38029:Objektstatistiken sind gesperrt
ora-20001 in Sammeln von Schemastatistiken auf 11g(FND_HISTOGRAM_COLS)
Sammeln von Statistiken in Release 11i und R12
Inkrementelles Sammeln von Statistiken in 11g
Anleitung Setzen Sie die Tabellenüberwachung in Oracle und die Beziehung zu STATISTICS_LEVEL