sql >> Base de Datos >  >> RDS >> Oracle

¿Importa el orden de las tablas a las que se hace referencia en la cláusula ON de JOIN?

JOIN el orden se puede forzar poniendo las tablas en el orden correcto en el FROM cláusula:

  1. 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
    
  2. Oracle tiene una pista especial ORDERED para hacer cumplir el JOIN orden:

    Esto usará un índice en b.id o crea una tabla hash en b :

    SELECT  /*+ ORDERED */
            *
    FROM    a
    JOIN    b
    ON      b.ID = a.StatusID
    

    Y esto usará un índice en a.StatusID o crea una tabla hash en a :

    SELECT  /*+ ORDERED */
            *
    FROM    b
    JOIN    a
    ON      b.ID = a.StatusID
    
  3. SQL Server tiene una sugerencia llamada FORCE ORDER hacer lo mismo:

    Esto usará un índice en b.id o crea una tabla hash en b :

    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 en a :

    SELECT  *
    FROM    b
    JOIN    a
    ON      b.ID = a.StatusID
    OPTION (FORCE ORDER)
    
  4. 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.