Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como encontrar a tabela onde as estatísticas estão bloqueadas


As estatísticas desempenharam um papel fundamental para o ajuste de desempenho do Oracle. O Oracle Optimizer cria o plano de execução com base nas estatísticas da tabela oracle envolvida nas consultas SQL.

Você pode querer bloquear estatísticas em uma tabela oracle em alguns casos, por exemplo
  • você não quer que uma tabela seja analisada por job de estatísticas de programação, mas quer analisá-la mais tarde ou com uma estimativa mais alta
  • você não deseja gerar as estatísticas da tabela por motivos de desempenho
  • você não quer que o servidor perca tempo gerando estatísticas quando os dados da tabela não forem alterados

Pode haver muitos outros casos em que queremos bloquear estatísticas

Índice

Como bloquear estatísticas na tabela


Você pode usar o pacote oracle padrão DBMS_STATS para bloquear as estatísticas na tabela
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

Como encontrar a tabela onde as estatísticas estão bloqueadas


Você pode usar a consulta abaixo para encontrar todas as tabelas onde as estatísticas estão bloqueadas
select owner, table_name, stattype_locked
from dba_tab_statistics
where stattype_locked is not null;

Executando o job de geração de estatísticas na tabela onde as estatísticas estão bloqueadas 


Se tentarmos executar coletar estatísticas nas tabelas onde as estatísticas estão bloqueadas, obteremos as estatísticas do objeto ORA-20005 estão bloqueadas (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


Podemos executar as etapas abaixo para desbloquear as estatísticas e gerar as estatísticas e bloquear novamente
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);

Como desbloquear estatísticas para tabela e esquema/desbloquear estatísticas de tabela para esquema


Agora, uma vez que descobrimos os objetos, podemos usar as consultas abaixo para desbloqueá-los
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');

Criação de índice com estatísticas bloqueadas na tabela


A partir de 10g, sempre que criamos o índice, as estatísticas são geradas automaticamente. Agora essa equação muda Quando a tabela é bloqueada, as estatísticas não serão geradas durante a criação do índice. Precisamos usar a opção FORCE para reunir as estatísticas ao criar o índice para objetos bloqueados. Vamos entender isso em detalhes vendo o exemplo
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.


Espero que você goste das informações sobre como bloquear/desbloquear estatísticas de tabelas no oracle. Além disso, agora você deve saber o que fazer quando ORA-20005:as estatísticas do objeto estão bloqueadas e ORA-38029:estatísticas de objetos estão bloqueados acontece

Artigos relacionados
Coleta de Estatísticas na Versão 11i e R12
Coleta de Estatísticas Incrementais em 11g
ora-20001 em Coleta de estatísticas de esquema em 11g(FND_HISTOGRAM_COLS)
Como definir Monitoramento de Tabela no Oracle e Relacionamento com STATISTICS_LEVEL
Tutorial Oracle:Como verificar estatísticas obsoletas
Modo Otimizador Oracle
Documentação Oracle sobre estatísticas