Há pelo menos 11 maneiras de controlar um plano sem modificar a consulta. Eles estão listados abaixo aproximadamente na ordem de utilidade:
- Linha de base do plano SQL - Substitua um plano por outro.
- 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.
- 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.
- 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.
- 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';
- Controle do sistema - Semelhante ao acima, mas se aplica a todo o sistema.
- 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.
- DBMS_ADVANCED_REWRITE - Altere uma consulta para outra consulta.
- 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.
- 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.
- 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.