Um dos grandes desafios no tema de Base de Dados esta relacionado com as estatísticas. Já abordei o tem em outros posts, como os links abaixo:
- https://m04m.com/2010/05/17/uma-breve-introducao-dos-componentes-do-motor-oracle-otimizador-por-custo/
- https://m04m.com/2010/05/20/finalmente-o-cbo-que-nao-do-mc-donalds/
- https://m04m.com/2010/04/08/estatisticas-de-sistema/
Uma das grandes confusões que há, é quando precisamos realizar testes com as estatísticas, porque realizar sobre um sistema em produção não parece ser boa ideía, certo?
Errado 🙂 :-), ou quase errado, obviamente que realizar testes em um ambiente que seja igual ao de produção é sempre a melhor idéia, porém, por vezes não há tempo ou condições de ter um ambiente parecido para simular estes testes.
Uma outra hipotese é utilizar pending statistics. O que é?
Este método permite que colete estatísticas sem que estas sejam publicadas para o CBO, ou seja, está visível apenas para sua visualização, o CBO não considera este tipo de estatísticas para gerar planos de execução.
Vamos a prática:
No meu teste, utilizei a tabela EMP do schema SCOTT.
- Para começar, vamos bloquear as estatísticas, para que não sejam publicadas / consideradas pelo CBO.
dbms_stats.set_table_prefs (ownname=>’SCOTT’,tabname=> ‘EMP’,pname=> ‘PUBLISH’,pvalue=>’FALSE’);
- Depois inibir as estatísticas, foi feito um select, para conferirmos a data/hora das estatísticas desta tabela.
- Na imagem abaixo, iremos prosseguir com os nossos testes:
- Na tabela DBA_TAB_PENDING_STATS, podemos ver as informações de estatísticas desta tabela que não estejam ainda disponíveis / publicadas para o CBO.
- Como não temos nada, então foi realizada a coleta de estatísticas da tabela EMP.
- Depois, iremos cruzar as informações das tabelas DBA_TAB_PENDING_STATS e DBA_TABLES.
Agora que já temos estatísticas novas, temos que utiliza-las, certo? Para isto temos que executar o comando abaixo:
alter session set optimizer_use_pending_statistics = true;
Pronto, agora podemos realizar os testes e avaliar o comportamento e novos planos de execução com estas estatísticas.
A partir destes testes, podemos apenas publicar estas estatísticas ou simplesmente apagar.
Para publicar / Tornar esta estatísticas disponível para o CBO:
dbms_stats.publish_pending_stats (‘SCOTT’, ‘EMP’);
Para apagar estas estatísticas:
dbms_stats.delete_pending_stats (‘SCOTT’,‘EMP’);
O único problema desta feature é que está disponível a partir do 11g 😦
Saudações Vascaínas ….