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

Como usar o Explain Plan para otimizar as consultas?


Eu também suponho que você esteja usando Oracle. E também recomendo que você confira a página da web do plano de explicação, para começar. Há muito para otimizar, mas pode ser aprendido.

Seguem algumas dicas:

Primeiro, quando alguém o encarrega de otimizar, quase sempre está procurando um desempenho aceitável em vez do desempenho final. Se você puder reduzir o tempo de execução de uma consulta de 3 minutos para 3 segundos, não se preocupe em reduzi-lo para 2 segundos, até que seja solicitado.

Segundo, faça uma verificação rápida para garantir que as consultas que você está otimizando estejam logicamente corretas. Parece absurdo, mas não posso dizer o número de vezes que me pediram conselhos sobre uma consulta de execução lenta, apenas para descobrir que ocasionalmente estava dando respostas erradas! E, como se vê, a depuração da consulta muitas vezes acabava por acelerá-la também.

Em particular, procure a frase "União Cartesiana" no plano de explicação. Se você vê-lo lá, as chances são muito boas de que você encontrou uma junção cartesiana não intencional. O padrão usual para uma junção cartesiana não intencional é que a cláusula FROM lista tabelas separadas por vírgula e as condições de junção estão na cláusula WHERE. Exceto que uma das condições de junção está ausente, de modo que o Oracle não tem escolha a não ser realizar uma junção cartesiana. Com tabelas grandes, isso é um desastre de desempenho.

É possível ver um Cartesian Join no plano de explicação onde a consulta está logicamente correta, mas associo isso a versões mais antigas do Oracle.

Procure também o índice composto não utilizado. Se a primeira coluna de um índice composto não for usada na consulta, o Oracle poderá usar o índice de forma ineficiente ou não usar. Deixe-me dar um exemplo:

A consulta foi:
select * from customers    
where
     State = @State
     and ZipCode = @ZipCode

(O DBMS não era Oracle, então a sintaxe era diferente e esqueci a sintaxe original).

Uma rápida olhada nos índices revelou um índice em Clientes com as colunas (País, Estado, CEP) nessa ordem. alterei a consulta para ler
  select * from customers
   where Country = @Country
      and State = @State
      and ZipCode = @ZipCode

e agora ele foi executado em cerca de 6 segundos em vez de cerca de 6 minutos, porque o otimizador foi capaz de usar o índice com vantagem. Perguntei aos programadores de aplicativos por que eles omitiram o país dos critérios, e esta foi a resposta deles:eles sabiam que todos os endereços tinham país igual a 'EUA', então acharam que poderiam acelerar a consulta deixando esse critério de fora!

Infelizmente, otimizar a recuperação do banco de dados não é realmente o mesmo que reduzir microssegundos do tempo de computação. Envolve entender o design do banco de dados, especialmente os índices, e pelo menos uma visão geral de como o otimizador faz seu trabalho.

Você geralmente obtém melhores resultados do otimizador quando aprende a colaborar com ele em vez de tentar ser mais esperto que ele.

Boa sorte para acelerar a otimização!