Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Spielt die Reihenfolge der Tabellen, auf die in der ON-Klausel des JOIN verwiesen wird, eine Rolle?

JOIN Die Reihenfolge kann erzwungen werden, indem die Tabellen im FROM in die richtige Reihenfolge gebracht werden Klausel:

  1. MySQL hat eine spezielle Klausel namens STRAIGHT_JOIN was die Reihenfolge wichtig macht.

    Dies wird einen Index auf b.id verwenden :

    SELECT  a.Name, b.Status
    FROM    a
    STRAIGHT_JOIN
            b
    ON      b.ID = a.StatusID
    

    Und dies wird einen Index auf a.StatusID verwenden :

    SELECT  a.Name, b.Status
    FROM    b
    STRAIGHT_JOIN
            a
    ON      b.ID = a.StatusID
    
  2. Oracle hat einen speziellen Hinweis ORDERED um den JOIN zu erzwingen Bestellung:

    Dies wird einen Index auf b.id verwenden oder erstellen Sie eine Hash-Tabelle auf b :

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

    Und dies wird einen Index auf a.StatusID verwenden oder erstellen Sie eine Hash-Tabelle auf a :

    SELECT  /*+ ORDERED */
            *
    FROM    b
    JOIN    a
    ON      b.ID = a.StatusID
    
  3. SQL Server hat einen Hinweis namens FORCE ORDER um dasselbe zu tun:

    Dies wird einen Index auf b.id verwenden oder erstellen Sie eine Hash-Tabelle auf b :

    SELECT  *
    FROM    a
    JOIN    b
    ON      b.ID = a.StatusID
    OPTION (FORCE ORDER)
    

    Und dies wird einen Index auf a.StatusID verwenden oder erstellen Sie eine Hash-Tabelle auf a :

    SELECT  *
    FROM    b
    JOIN    a
    ON      b.ID = a.StatusID
    OPTION (FORCE ORDER)
    
  4. PostgreSQL-Leute, tut mir leid. Ihre TODO-Liste sagt:

    Optimierungshinweise (nicht erwünscht)

    Optimierer-Hinweise werden verwendet, um Probleme im Optimierer zu umgehen. Wir möchten lieber, dass die Probleme gemeldet und behoben werden.

Die Reihenfolge im Vergleich spielt in keinem RDBMS eine Rolle , AFAIK.

Obwohl ich persönlich immer versuche abzuschätzen, nach welcher Spalte gesucht wird, und diese Spalte in die linke Spalte zu setzen (damit es wie ein lvalue aussieht ).

Siehe diese Antwort für mehr Details.