sql >> Database >  >> RDS >> Oracle

Hoe een tabel te vinden waarin statistieken zijn vergrendeld

Statistieken speelden een sleutelrol bij het afstemmen van de prestaties van Oracle. Oracle Optimizer maakt het uitvoeringsplan op basis van de statistieken van de Oracle-tabel die betrokken is bij de SQL-query's.

In sommige gevallen wilt u misschien statistieken in een orakeltabel vergrendelen, bijvoorbeeld

  • u wilt niet dat een tabel wordt geanalyseerd op basis van een geplande statistische taak, maar u wilt deze later of tegen een hogere schatting analyseren
  • u wilt om prestatieredenen geen statistieken voor de tabel genereren
  • je wilt niet dat de server tijd besteedt om statistieken te genereren wanneer de tabelgegevens niet veranderen

Er kunnen nog veel meer gevallen zijn waarin we statistieken willen vergrendelen

Inhoudsopgave

Statistieken op tafel vergrendelen

U kunt het standaard orakelpakket DBMS_STATS gebruiken om de statistieken op de tafel te vergrendelen

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

Hoe vind je een tabel waarin statistieken zijn vergrendeld

U kunt onderstaande zoekopdracht gebruiken om alle tabellen te vinden waar statistieken zijn vergrendeld

select owner, table_name, stattype_locked
from dba_tab_statistics
where stattype_locked is not null;

Loopstatistieken genereren Taak op de tafel waar statistieken zijn vergrendeld 

Als we proberen statistieken te verzamelen over de tabellen waar statistieken zijn vergrendeld, krijgen we ORA-2005 objectstatistieken zijn vergrendeld (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

We kunnen onderstaande stappen uitvoeren om de statistieken te ontgrendelen en de statistieken te genereren en opnieuw te vergrendelen

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);

Statistieken ontgrendelen voor tabel en schema / tabelstatistieken ontgrendelen voor schema

Zodra we de objecten hebben gevonden, kunnen we onderstaande zoekopdrachten gebruiken om ze te ontgrendelen

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');

Index aanmaken met statistieken vergrendeld op tafel

Vanaf 10g worden de statistieken automatisch gegenereerd wanneer we een index maken. Nu verandert deze vergelijking. Wanneer de tabel is vergrendeld, worden er geen statistieken gegenereerd tijdens het maken van de index. We moeten de FORCE-optie gebruiken om de statistieken te verzamelen tijdens het maken van een index voor vergrendelde objecten. Laten we dat in detail begrijpen door het voorbeeld te bekijken

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.

Ik hoop dat je de informatie over het vergrendelen/ontgrendelen van tabellenstatistieken in Oracle leuk vindt. Ook nu moet u weten wat u moet doen wanneer ORA-2005:objectstatistieken zijn vergrendeld en ORA-38029:objectstatistieken zijn vergrendeld gebeurt

Gerelateerde artikelen
Statistieken verzamelen in release 11i en R12
Incrementele statistieken verzamelen in 11g
ora-20001 in Schemastatistieken verzamelen op 11g(FND_HISTOGRAM_COLS)
Tabelbewaking instellen in Oracle en relatie met STATISTICS_LEVEL
Oracle-zelfstudie:oude statistieken controleren
Oracle Optimizer-modus
Oracle-documentatie over statistieken


  1. 60 miljoen inzendingen, selecteer inzendingen uit een bepaalde maand. Hoe database optimaliseren?

  2. Ons eigen hondenvoer eten - JIRA uitvoeren op MariaDB

  3. Wat is de beste manier om resultaten te pagineren in SQL Server?

  4. SQL SELECT SUM