sql >> Databasteknik >  >> RDS >> Oracle

Hur man hittar tabell där statistik är låst

Statistik spelade en nyckelroll för Oracles prestandajustering. Oracle Optimizer skapar exekveringsplanen baserat på statistiken för Oracle-tabellen som är involverad i SQL-frågorna.

Du kanske vill låsa statistik i en orakeltabell i vissa fall, till exempel

  • du vill inte att en tabell ska analyseras efter schema statistikjobb men vill analysera den senare eller med högre uppskattning
  • du vill inte generera statistik för tabellen av prestandaskäl
  • du vill inte att servern ska lägga tid på att generera statistik när tabelldata inte ändras

Det kan finnas många fler fall där vi vill låsa statistik

Innehållsförteckning

Hur man låser statistik på bordet

Du kan använda standard-oracle-paketet DBMS_STATS för att låsa statistiken på bordet

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

Hur hittar du tabeller där statistiken är låst

Du kan använda nedanstående fråga för att hitta alla tabeller där statistik är låst

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

Kör statistikgenerering Job på bordet där statistiken är låst 

Om vi ​​försöker köra samla statistik på tabellerna där statistik är låst får vi ORA-20005 objektstatistik är låst (stattyp =alla)

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

Vi kan utföra nedanstående steg för att låsa upp statistiken och generera statistiken och låsa igen

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

Hur man låser upp statistik för tabell och schema /lås upp tabellstatistik för schema

När vi nu tar reda på objekten kan vi använda nedanstående frågor för att låsa upp dem

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

Skapa index med statistik låst på tabellen

10g och framåt, när vi skapar index genereras statistiken automatiskt. Nu ändras denna ekvation När tabellen är låst genereras inte statistik när indexet skapas. Vi måste använda FORCE-alternativet för att samla in statistiken samtidigt som vi skapar index för låsta objekt. Låt oss förstå det i detaljer genom att se exemplet

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.

Hoppas du gillar informationen om hur man låser/låser upp tabellstatistik i Oracle. Nu måste du också veta vad du ska göra när ORA-20005:objektstatistik är låst och ORA-38029:objektstatistik är låsta händer

Relaterade artiklar
Samla statistik i Release 11i och R12
Inkrementell statistik Samla in 11g
ora-20001 i Samla schemastatistik på 11g(FND_HISTOGRAM_COLS)
Hur man ställer in tabellövervakning i Oracle och relation med STATISTICS_LEVEL
Oracle Tutorial:Hur man kontrollerar inaktuell statistik
Oracle Optimizer Mode
Oracle-dokumentation om statistik


  1. SQL Server Transaktionslogg — Del 1

  2. Exportera data från SQL Server till Excel och textfil via SSIS-paketet

  3. Microsoft Access Table Tips – Tricks och riktlinjer del 2

  4. How FOR XML PATH('') fungerar vid sammanlänkning av rader