STRAIGHT_JOIN
força a ordem de junção das tabelas, então table1
é escaneado no loop externo e table2
no laço interno. O otimizador não é perfeito (embora ainda bastante decente), e a causa mais provável são as estatísticas desatualizadas.
Não, apenas quando o otimizador está errado. Isso pode ocorrer se sua distribuição de dados estiver muito distorcida ou não puder ser calculada corretamente (digamos, para índices espaciais ou de texto completo).
Você deve coletar as estatísticas, construir os planos para ambas as formas e entender o que esses planos significam.
Se você ver isso:
-
O plano gerado automaticamente não é o ideal e não pode ser melhorado pelas formas padrão,
-
OSTRAIGHT_JOIN
versão é melhor, você entende que sempre será e entende por que sempre será
, use
STRAIGHT_JOIN
.