Finalmente o CBO que não é o do Mc Donalds :)

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:

  1. O user envia a query para o Oracle;
  2. O parser checa a sintaxe da query (hard), caso já esteja em memória faz um soft parser;
  3. O CBO recebe os vários planos de execuções possíveis para a query;
  4. Compara os planos execuções baseando-se nas informações de sistema, tabelas, parâmetros e etc;
  5. O CBO, em seu papel de juiz, escolhe o melhor plano que será executado;
  6. 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 ….