Banco de Dados - Oracle
O otimizador do Oracle para desenvolvedores - Parte I - Introdução
Primeiro artigo de uma série composta por três textos que apresentam os otimizadores do Oracle considerando apenas os aspectos importantes para os desenvolvedores de sistemas de informação. Neste artigo os otimizadores do Oracle serão apresentados, detalhando seus principais componentes.
por Vinícius RonconiCom o aumento da complexidade dos sistemas de informação que gerenciam informações diversas dentro de uma organização, um dos fatores preponderantes para o sucesso de um sistema é a capacidade de recuperar as informações de forma praticamente instantânea.
Algumas medidas simples podem trazer resultados significativos no desempenho dos sistemas. Para isto, basta aplicar algumas “regras de ouro” para a construção dos comandos SQL. Estas regras visam à construção de comandos que possam ser interpretados de forma mais simples pelo servidor de banco de dados, reduzindo a quantidade de dados acessados, ou ainda melhorando a forma de recuperar estes dados.
Antes de aplicar as dicas sobre como melhorar o desempenho dos comandos SQL, deve-se primeiramente entender o funcionamento dos otimizadores de banco de dados. O primeiro artigo desta série mostra quais são os componentes utilizados internamente pelo banco de dados para tentar melhorar o desempenho dos comandos que são submetidos para o servidor. Cada um dos componentes envolvidos será descrito para que os leitores possam compreender a maneira como eles trabalham. Este passo é fundamental para escrever os comandos da uma forma que o otimizador espera, proporcionando acessos muito mais rápidos ao banco de dados.
Esta série de artigos terá o enfoque nos pontos importantes para o desenvolvedor de aplicações. Desta maneira, detalhes de configuração que são importantes para os administradores de banco de dados, mas raramente acessíveis aos desenvolvedores não serão discutidos.
Os componentes
envolvidos
Para que um comando SQL possa ser executado, quatro componentes são utilizados: analisador gramatical (parser), otimizador (optimizer), gerador de registros (row source generator) e o executor de SQL (SQL executor). A forma como estes componentes interagem entre si é ilustrada pela Figura 1.
Figura 1 –
Fluxo de execução de uma consulta SQL
Quando uma consulta é enviada por um usuário do banco de dados, o primeiro componente utilizado é o analisador gramatical, verificando a sintaxe e semântica do comando. Ao concluir seu trabalho, o analisador gramatical encaminha o resultado para o otimizador. A escolha do otimizador depende da configuração realizada pelo administrador de banco de dados.
O otimizador modifica a consulta de forma a melhorar seu desempenho e encaminha o plano otimizado para o gerador de registros. Este componente será o responsável por gerar o plano de execução do comando e encaminhá-lo para o executor de SQL gerar o resultado final.
Analisador gramatical
Analisa se a sintaxe e a semântica de um comando estão corretas. Durante a análise sintáxica, o analisador gramatical verifica se os comandos foram descritos da maneira correta, enquanto na análise semântica o analisador gramatical confere se os objetos referenciados realmente existem no banco de dados.
Este componente também identifica as visões utilizadas nos comandos e as coloca em blocos separados, que serão otimizados separadamente pelo transformador de consultas.
Otimizador
É o principal componente para a execução de um comando, sendo responsável pela identificação da melhor forma de resolvê-lo. O Oracle possui duas formas de aperfeiçoar os comandos: baseado nas regras de negócio (RBO) e baseado no custo (CBO).
RBO (Rule Based Optimizer)
Esta forma de otimização considera as regras de negócio para escolher a forma de recuperar as informações do banco de dados. A partir da versão 10g, a Oracle deixou de dar suporte ao otimizador, deixando suas funcionalidades disponíveis apenas para manter a compatibilidade com aplicações antigas. As novas aplicações desenvolvidas devem utilizar o CBO. Atualmente não são realizadas evoluções neste otimizador, mas apenas as correções de erros que eventualmente são encontrados.
Para melhorar o desempenho de uma consulta, o RBO verifica apenas uma maneira de otimização. Ao encontrar a primeira forma aplicável, ele abandona o processo sem verificar se outros mecanismos podem ser aplicados.
Esta série de artigos não detalhará este otimizador, uma vez não é recomendada a construção de novos sistemas que utilizem este otimizador para melhorar o desempenho.
CBO (Cost-Based Optimizer)
Executa o comando de forma que consuma o mínimo de recursos de processamento. Para isto, o servidor de banco de dados busca maneiras alternativas para escrever o mesmo comando de forma que sua execução seja um processo mais simples. Para tentar verificar a melhor forma de escrever um comando, o otimizador utiliza as estatísticas e histogramas existentes para os objetos e operadores utilizados no comando. Caso as estatísticas ou histogramas não estejam disponíveis, o otimizador recorre a parâmetros previamente definidos para tentar chegar a uma solução melhor do que a apresentada.
Enquanto o RBO pára a verificação logo após encontrar a primeira otimização possível, o CBO realiza todas as otimizações possíveis aplicáveis à consulta. O trabalho deste otimizador é maior do que o realizado pelo RBO, mas o resultado final é melhor do que o alcançado pelo otimizador baseado em regras de negócio, uma vez que os recursos gastos durante a execução da consulta são menores.
Este otimizador também permite que o desenvolvedor dê sugestões (hints) a respeito de qual é a melhor forma de resolver um comando. Esta dica pode ser, por exemplo, a indicação de qual a melhor maneira de acessar os dados em uma tabela, ou a forma mais vantajosa de efetuar a junção entre duas tabelas.
Disponível desde o Oracle 7, este é o principal otimizador do Oracle desde então, e a partir do Oracle 10g, tornou-se o único otimizador ainda em desenvolvimento. Por este motivo, este otimizador será descrito em detalhe nos próximos artigos.
Gerador de registros
Recebe o plano otimizado do otimizador e gera o plano de execução, que é um conjunto de fontes de dados estruturados como uma árvore, onde cada fonte de dados retorna um conjunto de registros.
Executor de SQL
Componente que executa o plano de execução e produz o resultado final. Cada registro gerado pelo gerador de registros é executado por este componente.
Conclusão
Este artigo buscou trazer ao leitor os principais componentes utilizados pelo servidor de banco de dados Oracle para resolver as consultas que lhe são enviadas. Cada componente foi explicado, dando maior ênfase ao otimizador, por se tratar do componente mais importante neste processo. Detalhou-se ainda o fluxo realizado para que um comando submetido ao banco de dados seja resolvido e o resultado exibido para o usuário.
O próximo artigo detalhará o otimizador baseado em custo, que é o principal otimizador do Oracle. O outro otimizador, baseado em regras, não será mais abordado em virtude de sua descontinuidade nas versões mais recentes do Oracle. O artigo descreverá os componentes do CBO, explicando sobre os critérios utilizados para melhorar o desempenho das consultas.
Referências
•
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/optimops.htm
•
http://www.dba-oracle.com/oracle_tips_10g_cbo.htm
•
http://www.dbasupport.com/oracle/ora9i/CBO1_1.shtml