Dopo aver letto la query SQL lenta, non so come ottimizzare , mi ha fatto pensare alle prestazioni generali delle query. Certamente, abbiamo bisogno che i risultati della prima tabella (quando vengono unite altre tabelle) siano i più piccoli possibili prima di unirci (join interni per questa domanda) al fine di rendere le nostre query un po 'più veloci.
Esempio, se questo:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Sii migliore / più veloce di:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
La mia teoria è la seguente (questa potrebbe non essere l'implementazione corretta, sto provando a ricordare da un libro interno di SQL Server 2008 che ho letto (MSFT Press)):
- Il processore di query ottiene prima la tabella di sinistra (tabella1)
- Unisce la seconda tabella (tabella2) e forma un prodotto cartesiano prima di filtrare le righe necessarie (se applicabile)
- Quindi esegue le clausole WHERE, ORDER BY, GROUP BY, HAVING con l'ultima istruzione SEELCT.
Quindi, se nell'istruzione n. 1 sopra, la tabella è più piccola, il motore SQL ha meno lavoro da fare quando si formano i prodotti cartesiani. Quindi quando si raggiunge l'istruzione where, si ottiene un set di risultati ridotto da cui filtrare in memoria.
Potrei essere così lontano dal segno che è irreale. Come ho detto, è una teoria.
I tuoi pensieri?
Nota : ho appena pensato a questa domanda e non ho ancora avuto la possibilità di eseguire alcun test da solo.
Nota 2 : Contrassegnato come SQL Server in quanto non so nulla sull'implementazione di MySql ecc. Sentiti libero di rispondere / commentare comunque