Quale SQL scrivi?
-
22-07-2019 - |
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"
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 :)