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