Domanda

Quando si uniscono due tabelle, quali sono le differenze tra i due blocchi sottostanti e qual è l'approccio migliore?

Modello A:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
WHERE 1=1
    AND A.Name = "Foo"
    AND B.Title = "Bar"

Modello B:

SELECT ...
FROM A
    INNER JOIN B
        ON A.PK = B.FK
            AND B.Title = "Bar"
WHERE 1=1
    AND A.Name = "Foo"
È stato utile?

Soluzione

Questo differirà da persona a persona, ma penso che il modello A sia migliore.

Ciò che fa è che separa i join a livello di tabella dai filtri. Ciò potrebbe essere utile per le query con più join e più filtri perché separa chiaramente i due tipi di join in corso.

Altri suggerimenti

Preferisco il modello A, ma probabilmente non c'è alcuna differenza. Devi davvero guardare il piano di esecuzione per assicurarti che funzioni in modo efficiente.

Se sostituisci INNER JOIN con OUTER JOIN , ci sarà differenza.

Altrimenti, queste query:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

SELECT  ...
FROM    A
INNER JOIN
        B
ON      A.PK = B.FK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

SELECT  *
FROM    A, B
WHERE   B.Title = "Bar"
        AND A.Name = "Foo"
        AND A.PK = B.FK

sono identici.

Oracle , MySQL , PostgeSQL e SQL Server li tratteranno esattamente allo stesso modo e utilizzeranno esattamente lo stesso piano per tutti loro.

Userei questo:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
WHERE   A.Name = "Foo"
        AND B.Title = "Bar"

se esiste una chiave a colonna singola su B.FK , e questa:

SELECT  ...
FROM    A
INNER JOIN
        B
ON      B.FK = A.PK
        AND B.Title = "Bar"
WHERE   A.Name = "Foo"

se è presente una chiave composita su (B.FK, B.title) .

Le condizioni di join sono più visive in questo caso.

Potrei sbagliarmi su questo, ma vedo il primo approccio come più efficiente. Le tue query vengono eseguite al rovescio. Quindi, quando esegui per primo il tuo join, funzionerà più velocemente solo perché deve corrispondere su (probabilmente indicizzato) PK & amp; Campi FK e non nulla di estraneo come il campo del titolo (che è probabilmente un varchar, che rende la partita ancora più lenta). Quindi, quando arrivi alla clausola filtering where, hai meno dati su cui eseguire la corrispondenza. Totale speculazione però. Mi chiedo cosa direbbero gli altri. Non farebbe male vedere il piano di esecuzione su questo :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top