Statystyki odgrywają kluczową rolę w dostrajaniu wydajności Oracle. Oracle Optimizer tworzy plan wykonania na podstawie statystyk tabeli oracle biorącej udział w zapytaniach SQL.
W niektórych przypadkach możesz chcieć zablokować statystyki w tabeli Oracle, na przykład
- Nie chcesz, aby tabela była analizowana według harmonogramu zadań statystycznych, ale chcesz przeanalizować ją później lub przy wyższym oszacowaniu
- nie chcesz generować statystyk dla tabeli ze względu na wydajność
- nie chcesz, aby serwer tracił czas na generowanie statystyk, gdy dane w tabeli się nie zmieniają
Może być znacznie więcej przypadków, w których chcemy zablokować statystyki
Spis treści
Jak zablokować statystyki na stole
Możesz użyć standardowego pakietu Oracle DBMS_STATS, aby zablokować statystyki w tabeli
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 znaleźć tabelę, w której statystyki są zablokowane
Możesz użyć poniższego zapytania, aby znaleźć wszystkie tabele, w których statystyki są zablokowane
select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
Uruchamianie zadania generowania statystyk na stole, na którym statystyki są zablokowane
Jeśli spróbujemy uruchomić statystyki zbierania na tabelach, w których statystyki są zablokowane, otrzymamy statystyki obiektu ORA-20005 są zablokowane (typ stat =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
Możemy wykonać poniższe kroki, aby odblokować statystyki i wygenerować statystyki oraz ponownie je zablokować
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 odblokować statystyki dla tabeli i schematu / odblokować statystyki tabeli dla schematu
Teraz, gdy znajdziemy obiekty, możemy użyć poniższych zapytań, aby je odblokować
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');
Tworzenie indeksu ze statystykami zablokowanymi na stole
10g wzwyż, ilekroć tworzymy indeks, statystyki są generowane automatycznie.Teraz to równanie się zmienia Gdy tabela jest zablokowana, statystyki nie będą generowane podczas tworzenia indeksu. Musimy użyć opcji FORCE, aby zebrać statystyki podczas tworzenia indeksu dla zablokowanych obiektów. Zrozummy to szczegółowo, oglądając przykład
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.
Mam nadzieję, że podobają Ci się informacje o tym, jak blokować/odblokowywać statystyki tabel w Oracle. Również teraz musisz wiedzieć, co zrobić, gdy ORA-20005:statystyki obiektów są zablokowane i ORA-38029:statystyki obiektów są zablokowane, dzieje się
Powiązane artykuły
Gathering Statistics w wersji 11i i R12
Przyrostowe gromadzenie statystyk w 11g
ora-20001 in Gather schema stats on 11g(FND_HISTOGRAM_COLS)
Jak ustawić monitorowanie tabel w Oracle i relacji z STATISTICS_LEVEL
Samouczek Oracle:Jak sprawdzić przestarzałe statystyki
Tryb Oracle Optimizer
Dokumentacja Oracle dotycząca statystyk