Statistiken spielten eine Schlüsselrolle für das Oracle Performance Tuning. Oracle Optimizer erstellt den Ausführungsplan basierend auf den Statistiken der Oracle-Tabelle, die an den SQL-Abfragen beteiligt ist.
In manchen Fällen möchten Sie vielleicht Statistiken in einer Oracle-Tabelle sperren, zum Beispiel
- Sie möchten nicht, dass eine Tabelle nach Zeitplan-Statistikjob analysiert wird, sondern Sie möchten sie später oder mit einer höheren Schätzung analysieren
- Sie möchten die Statistiken für die Tabelle aus Leistungsgründen nicht generieren
- Sie möchten nicht, dass der Server Zeit damit verbringt, Statistiken zu erstellen, wenn sich die Tabellendaten nicht ändern
Es könnte noch viele weitere Fälle geben, in denen wir Statistiken sperren möchten
Inhaltsverzeichnis
So sperren Sie Statistiken für die Tabelle
Sie können das Standard-Oracle-Paket DBMS_STATS verwenden, um die Statistiken für die Tabelle zu sperren
exec dbms_stats.lock_table_stats('table_owner','table_name');
Example SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–------------ exec dbms_stats.lock_table_stats('TEST','TECH'); SELECT stattype_locked FROM dba_tab_statistics WHERE table_name = 'TEST' and owner = 'TECH'; STATTYPE_LOCKED —–-------- ALL
So finden Sie eine Tabelle, in der Statistiken gesperrt sind
Sie können die folgende Abfrage verwenden, um alle Tabellen zu finden, in denen die Statistik gesperrt ist
select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
Job zur Statistikgenerierung wird in der Tabelle ausgeführt, in der die Statistik gesperrt ist
Wenn wir versuchen, eine Statistiksammlung für die Tabellen auszuführen, in denen die Statistik gesperrt ist, erhalten wir die Meldung ORA-20005 Objektstatistiken sind gesperrt (stattype =all)
SQL> exec dbms_stats.gather_table_stats('TECH', 'TEST'); BEGIN dbms_stats.gather_table_stats('TECH', 'TEST'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at “SYS.DBMS_STATS”, line 10640 ORA-06512: at “SYS.DBMS_STATS”, line 10664 ORA-06512: at line 1
Wir können die folgenden Schritte ausführen, um die Statistiken zu entsperren und die Statistiken zu generieren und wieder zu sperren
exec dbms_stats.unlock_table_stats('TECH','TEST'); exec dbms_stats.gather_table_stats('TECH', 'TEST'); exec dbms_stats.lock_table_stats('TECH','TEST'); or exec dbms_stats.gather_table_stats('TECH', 'TEST',force=>true);
Entsperren von Statistiken für Tabellen und Schemas / Entsperren von Tabellenstatistiken für Schemas
Sobald wir die Objekte herausgefunden haben, können wir sie mit den folgenden Abfragen entsperren
unlock table stats for schema exec dbms_stats.unlock_schema_stats('schema_owner'); exec dbms_stats.unlock_table_stats('table_owner','table_name'); Example exec dbms_stats.unlock_schema_stats('TECH'); exec dbms_stats.unlock_table_stats('TECH','TEST');
Indexerstellung mit Statistiken, die für die Tabelle gesperrt sind
Ab 10g werden die Statistiken automatisch generiert, wenn wir einen Index erstellen. Jetzt ändert sich diese Gleichung. Wenn die Tabelle gesperrt ist, werden keine Statistiken generiert, während der Index erstellt wird. Wir müssen die FORCE-Option verwenden, um die Statistiken zu sammeln, während wir einen Index für gesperrte Objekte erstellen. Lassen Sie uns das im Detail verstehen, indem Sie sich das Beispiel ansehen
Example Lets first create the dummy table and lock the statistics on that table SQL> create table test as select a.* ,rownum id from all_objects a where rownum <1001; SQL> exec dbms_stats.lock_table_stats('TECH','TEST'); Now we will try to create index SQL> create index test_idx on test(id); Index created. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='TEST_IDX'; NUM_ROWS LAST_ANAL ---------- --------- So statistics on index is not generated automatically for the locked statistics table Lets try to generate the statistics using DBMS_STATS SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX'); BEGIN dbms_stats.gather_index_stats(null, 'TEST_IDX'); END; * ERROR at line 1: ORA-20005: object statistics are locked (stattype = ALL) ORA-06512: at "SYS.DBMS_STATS", line 10640 ORA-06512: at "SYS.DBMS_STATS", line 10664 ORA-06512: at line 1 So statistics generation failed. In order to generate stats on the index, We can use force option in dbms_stats to override this SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX',force=>true); PL/SQL procedure successfully completed. SQL> select num_rows, last_analyzed from user_ind_statistics where index_name ='IDX'; NUM_ROWS LAST_ANAL ---------- --------- 1000 01-SEP-17 Lets try to create a new index with compute statistics clause SQL> create index TEST_IDX1 on test(object_name) compute statistics; create index idx on test(object_name) compute statistics * ERROR at line 1: ORA-38029: object statistics are locked So ORA-38029 error happens, So we need to create index with out the compute statistics clause and then generate stats using force option SQL> create index TEST_IDX1 on test(object_name); SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); Same things happens if we rebuild the index with compute statistics option SQL> alter index TEST_IDX1 rebuild compute statistics; alter index TEST_IDX1 rebuild compute statistics * ERROR at line 1: ORA-38029: object statistics are locked SQL> alter index TEST_IDX1 rebuild; Index altered. SQL> exec dbms_stats.gather_index_stats(null, 'TEST_IDX1',force=>true); PL/SQL procedure successfully completed.
Ich hoffe, Ihnen gefallen die Informationen zum Sperren/Entsperren von Tabellenstatistiken in Oracle. Außerdem müssen Sie jetzt wissen, was zu tun ist, wenn ORA-20005:Objektstatistiken gesperrt sind und ORA-38029:Objektstatistik gesperrt sind, geschieht
Verwandte Artikel
Sammeln von Statistiken in Release 11i und R12
Inkrementelles Sammeln von Statistiken in 11g
ora-20001 in Sammeln von Schemastatistiken auf 11g(FND_HISTOGRAM_COLS)
Einstellen der Tabellenüberwachung in Oracle und Beziehung mit STATISTICS_LEVEL
Oracle-Tutorial:So überprüfen Sie veraltete Statistiken
Oracle-Optimierungsmodus
Oracle-Dokumentation zu Statistiken