O Oracle tem um dos otimizadores de consultas mais sofisticados do mercado. Na grande maioria das vezes, ele escolhe o plano de execução correto sozinho.
Mas não sempre.
Quando as estatísticas estão desatualizadas, quando a cardinalidade estimada difere muito da real, ou quando você conhece o dado melhor do que o otimizador — é aí que entram os hints.
O que são Hints?
Hints são instruções escritas diretamente no SQL, dentro de um comentário especial, que orientam o Cost Based Optimizer (CBO) a tomar uma decisão específica sobre o plano de execução.
SELECT /*+ HINT_EXEMPLO */ coluna1, coluna2
FROM tabela
WHERE condicao;
Três regras fundamentais:
- Sintaxe incorreta = hint ignorado silenciosamente. O Oracle não retorna erro.
- Todo hint (exceto
RULE) usa o CBO. - Hints são case-insensitive, mas nome e parâmetros precisam estar corretos.
Dicionário de Hints
AND_EQUAL
Função: Força um merge scan de múltiplos índices de coluna única.
SELECT /*+ AND_EQUAL(tabela indice1 indice2) */ coluna1
FROM tabela
WHERE condicao1 AND condicao2;
Depreciado desde o Oracle 10g.
APPEND
Função: Força inserção em direct path — dados escritos acima do high water mark. Com NOLOGGING, reduz drasticamente o redo.
INSERT /*+ APPEND */ INTO tabela (col1, col2)
SELECT col1, col2 FROM outra_tabela;
Quando usar:
- Cargas em batch de grande volume
- ETLs em janelas de manutenção
- Tabelas temporárias ou de staging
Restrições:
- Tabela não pode ter triggers que impeçam direct path
- Após INSERT com APPEND, tabela bloqueada para DML até commit
Boas práticas no uso de hints
Use hints como diagnóstico, não como solução permanente.
Documente sempre. Um hint sem comentário vai confundir qualquer DBA.
Valide com EXPLAIN PLAN:
EXPLAIN PLAN FOR
SELECT /*+ SEU_HINT */ * FROM sua_tabela WHERE condicao;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);