Nachdem ich Slow SQL-Abfragen gelesen hatte und nicht sicher war, wie ich sie optimieren sollte , dachte ich über die allgemeine Leistung von Abfragen nach. Sicherlich müssen die Ergebnisse der ersten Tabelle (wenn andere Tabellen verknüpft werden) vor dem Verknüpfen so klein wie möglich sein (innere Verknüpfungen für diese Frage), um unsere Abfragen ein bisschen schneller zu machen.
Beispiel, sollte dies:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Sei besser / schneller als:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Meine Theorie lautet wie folgt (dies ist möglicherweise nicht die richtige Implementierung, an die ich mich aus einem von mir gelesenen internen SQL Server 2008-Buch (MSFT Press) zu erinnern versuche):
- Der Abfrageprozessor erhält zuerst die linke Tabelle (table1)
- Verbindet sich mit der zweiten Tabelle (table2) und bildet ein kartesisches Produkt, bevor die erforderlichen Zeilen herausgefiltert werden (falls zutreffend)
- Anschließend werden die Klauseln WHERE, ORDER BY, GROUP BY, HAVING mit der letzten SEELCT-Anweisung ausgeführt.
Wenn also in der obigen Anweisung Nr. 1 die Tabelle kleiner ist, muss die SQL-Engine beim Bilden der kartesischen Produkte weniger Arbeit leisten. Wenn Sie dann die where-Anweisung erreichen, haben Sie eine reduzierte Ergebnismenge, aus der Sie im Speicher filtern können.
Ich könnte so weit von der Realität entfernt sein. Wie ich schon sagte, es ist eine Theorie.
Ihre Gedanken?
Hinweis : Ich habe gerade erst über diese Frage nachgedacht und hatte noch keine Gelegenheit, selbst Tests durchzuführen.
Hinweis 2 : Als SQL Server getaggt, da ich nichts über die Implementierung von MySql usw. weiß. Bitte zögern Sie nicht, auf jeden Fall zu antworten / zu kommentieren