Es gibt zwei Fragen hier: Die Antwort auf die erste davon ist ja: Die resultset einer HAVING
beladene Abfrage ist identisch mit der des Suchresultates der gleichen Abfrage als Unterabfrage ausgeführt, mit einer WHERE
Klausel dekoriert .
Die zweite Frage bezieht sich auf Leistung und Expressivität - hier gehen wir stark in die Umsetzung. Auf MySQL gibt es eine dünne rote Linie, wo die Performance auseinander zu driften beginnt: In dem Moment, in dem das Resultset der inneren Abfrage nicht mehr im Speicher gehalten werden kann. In diesem Fall erstellt MySQL eine Darstellung der inneren Abfrage auf der Festplatte und verwendet dann den Selektor WHERE
. Dies wird nicht passieren, wenn die Klausel HAVING
verwendet wird, wird die disqualifizierte Gruppe aus der Ergebnismenge entfernt.
Dies impliziert, dass je höher die Selektivität der Klausel ist, desto mehr Leistungsrelevanz hat es: Betrachten Sie Ergebnismenge von einer Million Zeilen der inneren Abfrage, die durch die HAVING
Klausel auf 5 Zeilen reduziert wird - es ist sehr wahrscheinlich, dass die Ergebnismenge der inneren Abfrage nicht im Speicher gehalten wird, aber es ist sehr wahrscheinlich, dass das endgültige Ergebnis gesetzt würde.
bearbeiten
hatte ich dieses ein Mal: Die Abfrage, die wenige Ausreißer von einer sehr gleichmäßig verteilt Tabelle (Anzahl der Stücke auf einer physische Maschine pro Tag in einer Werkstatt hergestellt) ausgewählt. Ich habe wegen der hohen IO-Last untersucht.
Edit 2
Bitte beachten Sie, dass die Abfrage-Cache ist für Subqueries nicht benutzt - IMHO ein Ort Entwicklung sollte mehr auf das Wesentliche konzentrieren - so die Unterabfrage Muster wird nicht von der inneren Abfrage Wesen profitieren eine zwischengespeicherte Ergebnismenge.
Sie sollten RDBMS auf die Frage, die ich denke, definieren. Ihre erste Abfrage ist in SQL Server 2008 nicht gültig, da Sie in der Auswahl auf einen Alias nicht verweisen können. Nur im OrderBy-Teil, wegen der logischen Abfrageverarbeitung. –
Ich vermute MySQL? Die erste Abfrage ist in Oracle aus dem gleichen Grund nicht gültig. – Ben
@Ben Ja, ich habe gerade den MySQL-Tag zur Klärung hinzugefügt. Vielen Dank. – fredoverflow