Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да намерите таблица, където статистиката е заключена

Статистиката играе ключова роля за настройката на производителността на 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 за статистика


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PLSQL Вмъкване в с подзаявка и клауза за връщане

  2. Преброяване на броя на съединените редове в лявото присъединяване

  3. Трябва ли да посочим не null за първичен ключ? Oracle/SQL

  4. как да добавите секунда в времевата марка на Oracle

  5. Къде са моите кръпки?