Le sottoquery di solito sono soddisfacenti a meno che non siano subquery dipendenti (noto anche come correlated subqueries). Se si utilizzano solo sottoquery indipendenti e stanno utilizzando indici appropriati, dovrebbero essere eseguiti rapidamente. Se si dispone di una sottoquery dipendente, è possibile che si verifichino problemi di prestazioni, poiché in genere una subquery dipendente deve essere eseguita una volta per ogni riga nella query esterna. Quindi se la query esterna ha 1000 righe, la sottoquery verrà eseguita 1000 volte. D'altra parte una subquery indipendente in genere deve essere valutata solo una volta.
Se non si è sicuri di cosa significhi una subquery dipendente o indipendente, ecco una regola generale: se si può prendere la sottoquery, rimuoverla dal suo contesto, eseguirla e ottenere un set di risultati, quindi è un independent subquery
.
Se si verifica un errore di sintassi poiché si riferisce ad alcune tabelle esterne alla sottoquery, si tratta di un dependent subquery
.
La regola generale prevede alcune eccezioni. Ad esempio:
- Molti ottimizzatori possono richiedere una sottoquery dipendente e trovare un modo per eseguirlo in modo efficiente come un JOIN. Ad esempio, una query NOT EXISTS potrebbe risultare in un piano di query ANTI JOIN, quindi non sarà necessariamente più lento della scrittura della query con un JOIN.
- MySQL ha un bug in cui una sottoquery indipendente all'interno di un'espressione IN viene erroneamente identificata come subquery dipendente e quindi viene utilizzato un piano di query non ottimale. Questo è apparentemente risolto nelle versioni più recenti di MySQL.
Se le prestazioni sono un problema, misurare le query specifiche e vedere cosa funziona meglio per voi.
fonte
2011-01-25 23:02:54
Non è che non ci sia un proiettile d'argento - il problema è che la domanda è troppo ampia per essere ragionevolmente risolta.Non c'è alcuna garanzia che ciò che funziona su un database (MySQL), funzioni esattamente allo stesso modo su un altro. La regola più semplice è che se le colonne della subquery si trovano nel set di risultati finale, utilizzare un JOIN: è il metodo più ottimale per ottenere i dati da due tabelle. Altrimenti, una sottoquery va bene, ma quelle correlate possono causare problemi (anche se non con EXISTS). –
Su quale base si afferma che le sottoquery sono state sovrasfruttate? Sembra strano decidere che _e quindi_ chiedere informazioni sulle migliori pratiche per l'utilizzo delle sottocommissioni. –
Possibile duplicato di [Join vs sub-query] (http://stackoverflow.com/questions/2577174/join-vs-sub-query) –