Frage

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM  PRACOWNICY
    GROUP BY NR_DZIALU
    HAVING NR_DZIALU = 30

oder

SELECT NR_DZIALU, COUNT (NR_DZIALU) AS LICZ_PRAC_DZIALU
    FROM PRACOWNICY
    WHERE NR_DZIALU = 30
    GROUP BY NR_DZIALU
War es hilfreich?

Lösung

Die Theorie (durch die Theorie ich meine SQL Standard- ) sagt, dass, wenn die vor der Rückkehr in Reihen gesetzt Ergebnis einschränkt und HAVING das Ergebnis nach bringt alle Zeilen eingestellt einschränkt. Also, wo ist schneller. Auf SQL Standard-DBMS-Systeme in dieser Hinsicht konform, nur HAVING verwenden, wenn Sie nicht die Bedingung auf einem WHERE setzen können (wie berechnete Spalten in einigen RDBMS).

Sie können nur den Ausführungsplan für beide sehen und für sich selbst überprüfen, wird nichts schlagen, dass (Messung für Ihre spezifische Anfrage in Ihrer spezifischen Umgebung mit Ihren Daten.)

Andere Tipps

Es könnte auf den Motor ab. MySQL zum Beispiel gilt, DIE fast letzte in der Kette, dh es fast keinen Raum für Optimierung ist. Aus der Handbuch :

  

Die HAVING-Klausel wird fast zuletzt angewandt, unmittelbar bevor die Elemente an den Client gesendet werden, ohne Optimierung. (LIMIT angewendet wird, nachdem er.)

Ich glaube, dass dieses Verhalten ist das gleiche in den meisten SQL-Datenbank-Engines, aber ich kann es nicht garantieren.

Die beiden Abfragen sind gleichwertig und DBMS Abfrage-Optimierer sollte erkennt dies und produziert den gleichen Abfrageplan erzeugen. Es kann nicht, aber die Situation ist ziemlich einfach zu erkennen, also würde ich jedes modernes System erwarten - auch Sybase -. Damit umgehen

HAVING-Klauseln verwendet werden, sollten die Bedingungen für Gruppenfunktionen anwenden, sonst können sie in der WHERE-Bedingung mvoed werden. Zum Beispiel. wenn Sie wollten Ihre Anfrage an Gruppen beschränken, die COUNT haben (działu)> 10, sagen wir, Sie müssten, um den Zustand in einer HAVING setzen, weil sie auf die Gruppen wirkt, nicht die einzelnen Reihen.

Ich würde erwarten, dass die WHERE-Klausel schneller sein würde, aber es ist möglich, sie optimieren würde genau das gleiche.

Zu sagen, sie würden optimieren ist nicht wirklich die Kontrolle zu nehmen und den Computer zu sagen, was zu tun ist. Ich würde zustimmen, dass die Verwendung von mit ist keine Alternative zu einer where-Klausel. Nachdem hat eine besondere Nutzung von wo so etwas wie eine Summe () verwendet, um eine Gruppe angewendet wird, und Sie wollen das Ergebnis begrenzen setzen nur Gruppen zu zeigen, dass eine Summe ()> als 100 per se ist. Mit Arbeiten auf Gruppen, in denen die Arbeiten an Reihen. Sie sind Äpfel und Orangen. Also wirklich, sollten sie nicht verglichen werden, wie sie sind zwei sehr unterschiedliche Tiere.

Sowohl die Aussagen werden gleiche Leistung sein, wie SQL Server ist intelligent genug, beide die gleichen Aussagen in einen ähnlichen Plan zu analysieren.

So spielt es keine Rolle, ob Sie WHERE oder HAVING in Ihrer Anfrage.

Aber, im Idealfall sollten Sie WHERE-Klausel syntaktisch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top