2009-12-15 7 views
11

In SQL (MSSQL, Oracle, ecc, a prescindere), quando si uniscono le tabelle, qual è il guadagno di aggiungere un filtro per la dichiarazione JOIN invece di averlo nella clausola WHERE?Filtering utilizzando la JOIN al posto di dove

cioè

SELECT * FROM X INNER JOIN Y ON X.A = Y.A WHERE X.B = 'SOMETHING' 

contro

SELECT * FROM X INNER JOIN Y ON X.A = Y.A AND X.B = 'SOMETHING' 

mi rendo conto che questo non funziona in tutti i casi, ma ho notato che in alcuni casi sembra che vi sia un guadagno di prestazioni mettendo il criteri di filtro nella dichiarazione JOIN. Tuttavia, poiché fa parte dell'istruzione JOIN, può anche causare un comportamento un po 'strano.

Pensieri?

+0

Duplicato: http://stackoverflow.com/questions/1018952/condition-within-join-or-where –

risposta

5

Per le query INNER JOIN, le caratteristiche delle prestazioni di questi filtri dipendono da molti fattori: la dimensione delle tabelle, l'indicizzazione, la selettività della query e altri fattori specifici dell'RDBMS su cui viene eseguita la query.

In LEFT e RIGHT OUTER JOIN, la posizione degli elementi filtranti molto più che INNER JOIN, colpisce poiché se sarà applicato prima (JOIN clausola) o dopo (WHERE clausola) la giunzione viene effettuata.

+2

In altre parole, incluso il filtro nella clausola ON di un OUTER JOIN potrebbe (will) produrre risultati diversi includendolo nella clausola WHERE. – APC

+1

Includere un filtro di uguaglianza nella clausola 'WHERE' di' OUTER JOIN' lo rende effettivamente un 'INNER JOIN'. – Quassnoi

5

A volte lo faccio nelle query che hanno molti join perché localizza tutte le informazioni sul join in una parte della query anziché avere alcune condizioni di join e alcune nella clausola where.

+2

Questo è anche il modo in cui lo uso: modello separato (join) dalla selezione (dove) – lexu

3

Per un JOIN INNER, non mi aspetto una differenza di prestazioni, ma piuttosto che si utilizzerebbe lo stesso piano se il filtro era nella clausola JOIN ... ON o WHERE. Personalmente preferisco usare i criteri di join nella clausola JOIN e il filtro nella clausola WHERE - una sorta di modo per attaccare tutti i "parametri" all'istruzione SQL nello stesso posto - questo non è necessariamente ragionevole o pensato. Al contrario, ad alcune persone piace avere tutto nella clausola JOIN per tenere tutto insieme.

La situazione con giunzioni esterne è diversa: c'è una differenza significativa tra "UN SINISTRO ESTERNO SINISTRO b ON a.a_id = b.a_id AND b.type = 1" e "UN SINISTRA GIUNTO ESTERNO b ON a.a_id = b.a_id WHERE b.type = 1 "- in effetti il ​​secondo sta forzando implicitamente un'unione interna. Questo sarebbe un altro motivo per mettere tutte queste condizioni nella clausola JOIN, per coerenza.

2

Queste sintassi sono anche ottimizzate per la stessa cosa dalla maggior parte RDBMS.

Io di solito preferisco questa sintassi:

SELECT * 
FROM X 
INNER JOIN 
     Y 
ON  X.A = Y.A 
WHERE X.B = 'SOMETHING' 

quando B non è una parte del collegamento logico tra A e B, e questo:

SELECT * 
FROM X 
INNER JOIN 
     Y 
ON  X.A = Y.A 
     AND X.B = 'SOMETHING' 

quando è.

0

Nulla, eccetto chiarezza e significato. A meno che tu non abbia unioni esterne.

0

Come utente umano (piuttosto che come ottimizzatore), quando mantengo una query, cerco una condizione di join nella clausola JOIN e una condizione di ricerca nella clausola WHERE.

Naturalmente, è necessario trovare un equilibrio tra problemi di prestazioni e problemi di manutenzione del codice. Tuttavia, la mia prima priorità è un buon codice logico in prima istanza, quindi ottimizzare come necessario.

Problemi correlati