Quali sono i vantaggi della chiusura transitiva esplicita del join in SQL?

StackOverflow https://stackoverflow.com/questions/11028

  •  08-06-2019
  •  | 
  •  

Domanda

Quando unisco tre o più tabelle insieme tramite una colonna comune, scrivo la mia query in questo modo:

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id

recentemente un collega mi ha chiesto perché non l'ho fatto esplicito Partecipa alla chiusura transitiva nelle mie domande come questa:

SELECT *
FROM   a, b, c
WHERE  a.id = b.id
AND    b.id = c.id
AND    c.id = a.id

ci sono davvero dei vantaggi in questo?Sicuramente l'ottimizzatore può implicarlo da solo?

modificare:So che è una sintassi malvagia, ma è un esempio veloce e sporco di codice legacy legittimo +1 @Stu per ripulirlo

È stato utile?

Soluzione

Non è necessario farlo nei motori di database di oggi, ma c'è stato un tempo in cui cose del genere avrebbero fornito al query optimization più suggerimenti sui possibili percorsi dell'indice e quindi su risultati più rapidi.

In questi giorni l'intera sintassi sta comunque scomparendo.

Altri suggerimenti

Questa è una sintassi sporca e malvagia.Scrivi questo come

Select
  *  -- Oh, and don't ever use *, either
From
  A 
  Inner Join B On A.ID = B.ID
  Inner Join C On B.ID = C.ID

No, questa sintassi risale a prima che i join fossero presenti nel linguaggio.Non sono sicuro dei problemi ad esso associati, ma ci sono sicuramente costrutti linguistici più supportati per unire le tabelle.

Voglio solo dire che questo tipo di unione è opera del diavolo.
Pensaci e basta;le condizioni per l'unione e il filtraggio vengono mescolate insieme nell'istruzione dove.
Cosa succede quando devi unirti a 20 tabelle e filtrare su 15 valori?

Ancora una volta, solo i miei $ 0,02

In Microsoft SQL i piani di query per queste due query sono identici: vengono eseguiti nello stesso modo.

Se lo guardi da un punto di vista matematico, i tuoi esempi dovrebbero produrre gli stessi risultati.

un = b = c

Quindi il tuo primo esempio produrrebbe gli stessi risultati del secondo, quindi non c'è bisogno di fare lavoro extra.

Questa domanda è simile a questa qui con una spiegazione molto approfondita:

Domanda SQL dall'articolo di Joel Spolsky

La risposta breve è che la dichiarazione esplicita della proprietà transitiva può accelerare la query.Questo perché l'ottimizzazione delle query non è un compito banale e alcuni server SQL potrebbero avere problemi con essa.

Quella sintassi ha i suoi usi però...ci sono momenti in cui ti accorgi che devi unire due tabelle su più di un campo

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