JOIN
el orden se puede forzar poniendo las tablas en el orden correcto en el FROM
cláusula:
-
MySQL tiene una cláusula especial llamada
STRAIGHT_JOIN
lo que hace que el orden importe.Esto usará un índice en
b.id
:SELECT a.Name, b.Status FROM a STRAIGHT_JOIN b ON b.ID = a.StatusID
Y esto usará un índice en
a.StatusID
:SELECT a.Name, b.Status FROM b STRAIGHT_JOIN a ON b.ID = a.StatusID
-
Oracle tiene una pista especial
ORDERED
para hacer cumplir elJOIN
orden:Esto usará un índice en
b.id
o crea una tabla hash enb
:SELECT /*+ ORDERED */ * FROM a JOIN b ON b.ID = a.StatusID
Y esto usará un índice en
a.StatusID
o crea una tabla hash ena
:SELECT /*+ ORDERED */ * FROM b JOIN a ON b.ID = a.StatusID
-
SQL Server tiene una sugerencia llamada
FORCE ORDER
hacer lo mismo:Esto usará un índice en
b.id
o crea una tabla hash enb
:SELECT * FROM a JOIN b ON b.ID = a.StatusID OPTION (FORCE ORDER)
Y esto usará un índice en
a.StatusID
o crea una tabla hash ena
:SELECT * FROM b JOIN a ON b.ID = a.StatusID OPTION (FORCE ORDER)
-
Chicos de PostgreSQL, lo siento. Tu lista de TODO dice:
Sugerencias del optimizador (no deseadas)
Las sugerencias del optimizador se utilizan para solucionar problemas en el optimizador. Preferiríamos que los problemas fueran informados y solucionados.
En cuanto al orden en la comparación, no importa en ningún RDBMS
, AFAIK.
Aunque personalmente siempre trato de estimar qué columna se buscará y coloco esta columna a la izquierda (para que parezca un lvalue
).
Ver esta respuesta para más detalles.