Artigo no estilo Mentoring
Sem dúvida, trata-se de um recurso poderoso nas mãos dos
desenvolvedores. Contudo, seu uso pode trazer armadilhas e a solução adotada
pode se transformar em um grande problema. Neste contexto, este artigo discute
em que situações o uso de hints pode ser benéfico e, em qual delas, prejudicial.
Hints (sugestões) nada mais são que comentários em uma instrução SQL que passam “dicas” para o otimizador do banco de dados Oracle. Via de regra, o otimizador usa essas dicas para escolher o melhor plano de execução para a instrução, a menos que haja alguma condição que impeça esta escolha. É como se “induzíssemos” explicitamente o otimizador de consulta a utilizar um determinado plano de execução.
As Hints foram inicialmente introduzidas no banco de dados na versão Oracle 7, uma época em que os desenvolvedores e DBAs tinham pouquíssimos recursos para contornar os problemas de performance caso o otimizador escolhesse um plano de execução ruim (sim, isso é possível de acontecer, já que esta escolha é feita a partir de algoritmos e diversos fatores podem influenciar para uma escolha equivocada).
Atualmente a Oracle oferece uma série de ferramentas, como o SQL Tuning Advisor, gerenciamento de planos de consulta e também SQL Performance Analyzer, que auxiliam a resolver problemas de performance quando o otimizador não encontra (ou escolhe) um bom plano de execução.
Uma recomendação geral, que particularmente também concordamos, é que sejam utilizadas essas ferramentas em vez de Hints, pois as Hints “forçarão” o uso de determinado plano de execução independente da mudança de comportamento do ambiente (como crescimento do volume de dados, por exemplo).
A ideia em se utilizar as ferramentas é a de encontrar o motivo pelo qual o otimizador esteja escolhendo um plano ineficiente e corrigir esta causa.
Desta forma, mesmo que o comportamento do ambiente se altere, o otimizador continuará escolhendo o melhor plano e não utilizará sempre o mesmo indiscriminadamente.
As Hints devem ser usadas com cuidado e apenas em situações emergenciais onde as estatísticas nas tabelas relevantes estejam atualizadas e o plano de execução escolhido pelo otimizador sem a Hint não for bom. Vale lembrar que alterações no comportamento do banco de dados e também melhorias de desempenho de consultas ou novas implementações no otimizador em versões mais novas do banco de dados podem ter um impacto significativo na maneira como as Hints afetam o otimizador.
Em resumo, caso decida utilizar as Hints em vez das ferramentas de ajuste fornecidas pela Oracle, tenha em mente que qualquer benefício em curto prazo pode não oferecer boa performance a longo prazo.
Como influenciar o otimizador de consultas
De maneira geral, as escolhas feitas pelo otimizador de consultas são adequadas para a maioria das consultas. Porém, em alguns casos o otimizador pode “errar” (normalmente influenciado por algum fator desconhecido), ou ainda pode haver algum caso em que o desenvolvedor ou DBA possuam alguma informação que o otimizador não tem conhecimento (como o comportamento de uma carga de dados, por exemplo). É para estes casos que influenciar o otimizador pode ser uma boa estratégia para garantir uma boa performance.
Pode-se influenciar o otimizador através de várias técnicas, incluindo SQL Profiles, gerenciamento de planos SQL, parâmetros de inicialização e as Hints ...