Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So finden Sie eine Tabelle, in der Statistiken gesperrt sind

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