Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak znaleźć tabelę, w której statystyki są zablokowane?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę przyspieszyć row_number w Oracle?

  2. Oracle, Ustaw datę i godzinę jako pierwszy dzień miesiąca

  3. Jak zaktualizować Oracle Clob za pomocą JDBC?

  4. ORA-24408:nie można wygenerować unikalnej nazwy grupy serwerów

  5. Jak uzyskać dni robocze lub godziny między dwiema datami?