sql >> Databáze >  >> RDS >> Oracle

Jak najít tabulku, kde jsou uzamčeny statistiky

Statistiky hrály klíčovou roli pro ladění výkonu Oracle. Oracle Optimizer vytváří plán provádění na základě statistik tabulky Oracle zapojené do dotazů SQL.

V některých případech můžete chtít uzamknout statistiky v tabulce Oracle, například

  • nechcete, aby byla tabulka analyzována pomocí naplánované úlohy statistiky, ale chcete ji analyzovat později nebo s vyšším odhadem
  • nechcete generovat statistiky pro tabulku z důvodu výkonu
  • nechcete, aby server trávil čas vytvářením statistik, když  se data tabulky nezmění

Případů, kdy chceme uzamknout statistiky, může být mnohem více

Obsah

Jak uzamknout statistiky v tabulce

K uzamčení statistik v tabulce můžete použít standardní balíček Oracle DBMS_STATS

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

Jak najít tabulku se zamčenými statistikami

Můžete použít níže uvedený dotaz k nalezení všech tabulek, kde jsou statistiky uzamčeny

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

Spuštění úlohy generování statistik na stole, kde jsou statistiky uzamčeny 

Pokud se pokusíme spustit shromažďování statistik v tabulkách, kde je statistika uzamčena, dostaneme Statistiky objektů ORA-20005 jsou zamčené (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

Pro odemknutí statistik, vygenerování statistik a opětovné zamknutí můžeme provést níže uvedené kroky

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

Jak odemknout statistiky pro tabulku a schéma /odemknout statistiky tabulky pro schéma

Nyní, jakmile zjistíme objekty, můžeme je odemknout pomocí níže uvedených dotazů

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

Vytvoření indexu se statistikami uzamčenými v tabulce

Od 10g dále, kdykoli vytvoříme index, statistiky se generují automaticky. Nyní se tato rovnice změní Když je tabulka uzamčena, statistiky se při vytváření indexu negenerují. Potřebujeme použít volbu FORCE ke shromažďování statistik při vytváření indexu pro uzamčené objekty. Pojďme si to podrobně vysvětlit v příkladu

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.

Doufám, že se vám budou líbit informace o tom, jak zamknout/odemknout statistiky tabulek v oracle. Nyní také musíte vědět, co dělat, když ORA-20005:statistika objektů je uzamčena a ORA-38029:statistika objektů are locked stane

Související články
Shromažďování statistik ve verzi 11i a R12
Přírůstkové statistiky Shromažďování v 11g
ora-20001 v Shromažďování statistik schématu na 11g(FND_HISTOGRAM_COLS)
Jak nastavit sledování tabulek v Oracle a Relationship s STATISTICS_LEVEL
Výukový program Oracle:Jak zkontrolovat zastaralé statistiky
Režim Oracle Optimizer
Dokumentace Oracle o statistikách


  1. Připravené prohlášení o Postgresql in Rails

  2. Zápis souboru csv do databáze SQL Server pomocí pythonu

  3. Vytvářejte fyzické zálohy databází MariaDB nebo MySQL

  4. Jak vytvořit více jeden k jednomu