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

Existe uma maneira de forçar o Oracle a alterar o plano de uma consulta sem usar dicas?


Há pelo menos 11 maneiras de controlar um plano sem modificar a consulta. Eles estão listados abaixo aproximadamente na ordem de utilidade:
  1. Linha de base do plano SQL - Substitua um plano por outro.
  2. Perfis SQL - Adicione dicas "corretivas" aos planos. Por exemplo, um perfil pode dizer "essa junção retorna 100 vezes mais linhas do que o esperado", o que altera indiretamente o plano.
  3. Esboço Armazenado - Semelhante em ideia ao SQL Plan Baseline, mas com menos recursos. Esta opção é mais simples de usar, mas menos poderosa e não é mais suportada.
  4. DBMS_STATS.SET_X_STATS - Modificar manualmente as estatísticas de tabela, coluna e índice pode alterar significativamente os planos, fazendo com que os objetos pareçam artificialmente mais ou menos caros.
  5. Controle de sessão - Por exemplo alter session set optimizer_features_enable='11.2.0.3'; . Nem sempre existem parâmetros úteis. Mas um dos parâmetros OPTIMIZER_* pode ajudar, ou você pode alterar o plano com uma dica não documentada ou desabilitar um recurso como este:alter session set "_fix_control"='XYZ:OFF';
  6. Controle do sistema - Semelhante ao acima, mas se aplica a todo o sistema.
  7. DBMS_SPD - Uma diretiva de plano SQL é semelhante a um perfil, pois fornece algumas informações corretivas ao otimizador. Mas isso funciona em um nível mais baixo, em todos os planos, e é novo no 12c.
  8. DBMS_ADVANCED_REWRITE - Altere uma consulta para outra consulta.
  9. Banco de dados privado virtual - Mude uma consulta para outra consulta, adicionando predicados. Não se destina ao desempenho, mas você provavelmente pode abusar dele para alterar os caminhos de acesso do índice.
  10. Estrutura de tradução SQL - Mude uma consulta para outra consulta, antes mesmo de ser analisada. Isso pode permitir que SQL totalmente "errado" seja executado.
  11. Patch SQL (dbms_sqldiag internal.i_create_patch) - Mude uma consulta para outra consulta. Semelhante ao DBMS_ADVANCED_REWRITE, mas não documentado e talvez um pouco mais poderoso.