Статистиката играе ключова роля за настройката на производителността на Oracle. Oracle Optimizer създава плана за изпълнение въз основа на статистическите данни на таблицата на Oracle, участваща в SQL заявките.
Може да искате да заключите статистически данни в таблица на оракул в някои случаи, например
- не искате таблицата да се анализира по график , но искате да я анализирате по-късно или при по-висока оценка
- не искате да генерирате статистически данни за таблицата поради причина за ефективност
- не искате сървърът да прекарва време да генерира статистически данни, когато данните в таблицата не се променят
Може да има много повече случаи, когато искаме да заключим статистика
Съдържание
Как да заключвам статистически данни на таблицата
Можете да използвате стандартния пакет на оракул 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
Как да намеря таблица, където статистическите данни са заключени
Можете да използвате заявката по-долу, за да намерите всички таблици, където статистиката е заключена
select owner, table_name, stattype_locked from dba_tab_statistics where stattype_locked is not null;
Изпълнява се задача за генериране на статистически данни в таблицата, където статистиката е заключена
Ако се опитаме да изпълним статистически данни за събиране на таблици, където статистиката е заключена, получаваме ORA-20005 обектната статистика е заключена (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
Можем да изпълним стъпките по-долу, за да отключим статистиката и да генерираме статистиката и да заключим отново
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);
Как да отключите статистически данни за таблица и схема /отключете статистика за таблица за схема
Сега, след като открием обектите, можем да използваме заявки по-долу, за да ги отключим
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');
Създаване на индекс със статистически данни, заключени в таблицата
10g нататък, когато създаваме индекс, статистическите данни се генерират автоматично. Сега това уравнение се променя Когато таблицата е заключена, статистиката няма да бъде генерирана при създаването на индекса. Трябва да използваме опция FORCE, за да съберем статистическите данни, докато създаваме индекс за заключени обекти. Нека разберем това в подробности, като видим примера
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.
Надяваме се да ви хареса информацията как да заключите/отключите статистики на таблици в oracle. Също така сега трябва да знаете какво да правите, когато ORA-20005:статистическите данни за обекта са заключени и ORA-38029:статистика на обекти са заключени случва
Сродни статии
Събиране на статистически данни в Release 11i и R12
Постепенно събиране на статистически данни в 11g
ora-20001 в Събиране на статистически данни за схемата на 11g(FND_HISTOGRAM_COLS)
Как да настроите наблюдение на таблици в Oracle и връзка с STATISTICS_LEVEL
Урок за Oracle:Как да проверите остарели статистически данни
Режим на Oracle Optimizer
Документация на Oracle за статистика