Tentei colocar de forma sucinta o funcionamento do Cost-Based Optimizer (CBO), sem entrar em muitos detalhes técnicos, o objetivo é fazer entender o funcionamento do CBO.
Execution Plan:
Para falarmos de CBO é importante o conceito de execution plan, que nada mais é um caminho estruturado para se chegar aos dados que a query pretende. Nesta árvore estruturada, cada nó tem como por objetivo, filtrar e/ou acessar as porções de dados das tabelas e processar os relacionamentos (joins).
CBO:
Como falei no post anterior, o CBO têm por finalidade de eleger o melhor plano de execução possível para cada query, então basicamente temos o seguinte fluxograma:
- O user envia a query para o Oracle;
- O parser checa a sintaxe da query (hard), caso já esteja em memória faz um soft parser;
- O CBO recebe os vários planos de execuções possíveis para a query;
- Compara os planos execuções baseando-se nas informações de sistema, tabelas, parâmetros e etc;
- O CBO, em seu papel de juiz, escolhe o melhor plano que será executado;
- A query é executada com o plano de execução escolhido e os dados são retornados para o utilizador;
Em relação ao ponto 2 (Hard Parse vs. Soft Parse): Cada query quando processada pela 1ª vez, passa por todo o fluxo ilustrado e é guardado na shared pool, para que a próxima execução seja mais rápida. Portanto o Hard Parse passa por todo o fluxograma, enquanto o Soft Parse poupa (principalmente CPU) procedimentos, sendo necessário apenas os pontos 1,2 e 6.
Em relação ao ponto 4: Para que o Oracle consiga fazer um “julgamento” realmente bom, é imporantissímo que as informações estejam coerentes e implementadas, por vezes se esquece estatísticas de sistema, ou de atualizar estatísticas das tabelas. Todas aquelas informações estão correlacionadas.
É importante o trabalho de manutenção de estatísticas (com os seus vários possíveis metódos) sobre as tabelas, levando em consideração particionamentos, índices, histogramas e etc.
Baseado nisto, cada query só pode ter um plano de execução. Portanto, é possível relacionar a v$sqlarea com v$sql_plan através das colunas plan_hash_value e sql_id.
Em um próximo post irei falar um pouco de histogramas 🙂
Saudações Vascaínas ….
Grande Ozal….
Hoje tive de vir aqui…pois pensei que estava maluco… me tornando velho e esquecido…
Só digo uma coisa a muito DBA com 10 anos de experiência que deveria ler isso.
Um grande abraço.
Update…
Grande Ozal….
Hoje tive de vir aqui…pois pensei que estava maluco… me tornando velho e esquecido…
Só digo uma coisa há muitos DBA’s com 10 anos de experiência que deveriam ler isso.
Um grande abraço.