SQL Filterkriterien in Verknüpfungskriterien oder where-Klausel, die ist effizienter
-
05-07-2019 - |
Frage
Ich habe eine relativ einfache Abfrage Verbinden von zwei Tabellen. Das „Wo“ Kriterien ausgedrückt werden kann entweder in den Kriterien beitreten oder als where-Klausel. Ich frage mich, was effizienter ist.
Abfrage ist max Verkäufe für einen Verkäufer von Anbeginn der Zeit zu finden, bis sie gefördert wurden.
Fall 1
select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales on salesman.salesmanid =sales.salesmanid
and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
Fall 2
select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales on salesman.salesmanid =sales.salesmanid
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
Hinweis Fall 1 fehlt eine where-Klausel insgesamt
RDBMS ist SQL Server 2005
Bearbeiten
Wenn das zweite Stück der Verknüpfungskriterien oder das where-Klausel war sales.salesdate
Lösung
Ich würde nicht auf der Leistung als entscheidenden Faktor verwende hier - und ganz ehrlich, ich glaube nicht, dass es irgendein messbarer Performance-Unterschied zwischen diesen beiden Fällen wirklich
.Ich würde immer Fall # 2 verwenden - warum? Denn meiner Meinung nach, sollten Sie nur die tatsächlichen Kriterien setzen, die die Verbindung zwischen den beiden Tabellen in der JOIN-Klausel etablieren -. Alles andere gehört in der WHERE-Klausel
Nur eine Frage der Dinge sauber zu halten und die Dinge bringen, wo sie hingehören, IMO.
Natürlich gibt es Fälle, mit LEFT OUTER Joins, bei denen die Anordnung der Kriterien einen Unterschied in Bezug auf die macht, welche Ergebnisse zurückgegeben bekommen -. Die Fälle von meiner Empfehlung ausgeschlossen würde, natürlich
Marc
Andere Tipps
Sie können den Ausführungsplan Schätzer und SQL Profiler ausführen, um zu sehen, wie sie gegeneinander stapeln.
Sie sind jedoch semantisch das gleiche unter der Haube nach diesem SQL Server MVP:
http://www.eggheadcafe.com/conversation.aspx?messageid = 29145383 & threadid = 29145379
Ich ziehe es keine harten codierten Kriterien haben in der Verknüpfung. Es macht den SQL viel besser lesbar und tragbar.
Ablesbarkeit: Sie können genau sehen, welche Daten Sie gehen zu bekommen, weil alle Tabellen Kriterien genau dort geschrieben wird in der Verknüpfung. In großen Aussagen, können die Kriterien innerhalb von 50 anderen Ausdrücken begraben und ist leicht zu übersehen.
Portabilität: Sie können nur ein Stück aus der FROM-Klausel kopieren und woanders einfügen. Das gibt die Verbindungen und alle Kriterien müssen Sie mit ihm gehen. Wenn Sie immer diese Kriterien verwenden, wenn diese beiden Tabellen verknüpft werden, dann ist es in der Umsetzung Join ist die logischste.
Beispiel:
FROM
table1 t1
JOIN table2 t2_ABC ON
t1.c1 = t2_ABC.c1 AND
t2_ABC.c2 = 'ABC'
Wenn Sie eine zweite Spalte aus Tabelle erhalten müssen 2 Sie kopieren nur, dass der Block in dem Editor, Suche / repalce „ABC“ und presto und ganz neuen Codeblock bereit wieder einzufügen.
Zusätzlich: Es ist auch einfacher zwischen einem inneren und äußeren Änderungen kommen, ohne sich um irgendwelche Kriterien kümmern, die in der WHERE-Klausel im Umlauf sein.
Ich behalte die WHERE-Klausel ausschließlich für Laufzeitkriterien, soweit möglich.
Wie für Effizienz: Wenn Sie Excecution Geschwindigkeit sich beziehen, dann wie alle anderen auch festgestellt hat, ist es überflüssig. Wenn Sie zu einem leichteren Debuggen und Wiederverwendung sie beziehen, dann ziehe ich die Option 1.
Eine Sache, die ich schließlich sagen will, wie ich benachrichtigt, bevor das .. Beide Wege können die gleiche Leistung geben oder die Kriterien bei mit Wobei Klausel kann etwas schneller sein als in einigen Antworten gefunden ..
Aber ich einen Unterschied identifiziert, können Sie für Ihre logischen Bedürfnisse verwenden ..
-
, um die Kriterien bei ON Klausel nicht filtern / Überspringen der Zeilen statt wählen verbinden die Spalten null auf den Bedingungen beruhen würden
-
, um die Kriterien bei Wo Klausel kann filtern / überspringen die Zeilen an den gesamten Ergebnisse
Ich glaube nicht, es eine endliche Antwort auf diese finden, die für alle Fälle gilt. Die 2 sind nicht immer austauschbar - da für einige Abfragen (einige linke Joins) Sie mit unterschiedlichen Ergebnissen kommen wird durch die Kriterien in der WHERE vs der FROM-Zeile setzen
.In Ihrem Fall sollten Sie diese beiden Abfragen auszuwerten. In SSMS können Sie die geschätzten und tatsächlichen Ausführungspläne beider dieser Abfragen sehen - das ist ein guter erster Schritt bei der Bestimmung wäre das mehr optimal ist. Sie konnten sehen auch die Zeit & IO für jede (set statistics Zeit auf, Set-Statistiken io on) - und das finden Sie auch Informationen geben, um Ihre Entscheidung zu treffen
.Bei den Abfragen in Ihrer Frage - ich würde wetten, dass sie beide mit dem gleichen Abfrageplan kommen werden - so in diesem Fall kann es keine Rolle, in anderen aber könnte es möglicherweise verschiedene Pläne produziert <. / p>
Versuchen Sie dies den Unterschied zwischen den 2 zu sehen ...
SET STATISTICS IO ON
SET STATISTICS TIME ON
select salesman.salesmanid,
max(sales.quantity)
from salesmaninner join sales on salesman.salesmanid =sales.salesmanid
and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
select salesman.salesmanid,
max(sales.quantity)
from salesmaninner join sales on salesman.salesmanid = sales.salesmanid
where sales.salesdate < salesman.promotiondate
group by salesman.salesmanid
SET STATISTICS TIME OFF
SET STATISTICS IO OFF
Es kann frivol erscheinen, aber die Antwort ist, je nachdem, welche Abfrage, für die die Query Analyzer den effizientesten Plan produziert.
In meinen Augen scheinen sie äquivalent zu sein, so dass die Query Analyzer kann auch identische Pläne produzieren, aber Sie würden testen.
Weder ist effizient, mit dem WHERE-Methode auf die alte Weise in Betracht gezogen wird, dies zu tun ( http://msdn.microsoft.com/en-us/library/ms190014.aspx ). Sie können den Ausführungsplan betrachten und sehen, dass sie das gleiche tun.
Werden Sie mit dem geschätzten Ausführungsplan in SQL Management Studio vertraut !! Wie schon andere gesagt haben, du bist an der Gnade des Analysators, egal was Sie tun, um ihre Schätzungen vertrauen. Ich würde vermuten, die zwei, die Sie mit dem exakt gleichen Plan zur Verfügung gestellt würde produzieren.
Wenn es ein Versuch, eine Entwicklungskultur zu ändern, die eine auswählen, die Ihnen einen besseren Plan gibt; für diejenigen, die identisch sind, folgen Sie der Kultur
Ich habe dies auf andere „Effizienz“ Beiträge wie diese kommentiert (es ist sowohl aufrichtig und sarkastisch.) - wenn das ist, wo Ihre Engpässe befinden, dann high-five zu Ihnen und Ihrem Team
Fall 1 (Kriterien im JOIN) sind besser für die Verkapselung und erhöhte Verkapselung ist in der Regel eine gute Sache: verminderte copy / paste Auslassungen zu einer anderen Abfrage, verringert Fehler, wenn später LEFT umgewandelt JOIN und erhöhte Lesbarkeit (bezogenes zusammen und weniger „Rauschen“ in WHERE-Klausel). In diesem Fall erfasst die WHERE-Klausel nur Haupttabelle Kriterien oder Kriterien, die mehrere Tabellen umfasst.