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

War es hilfreich?

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 ..

  1. , um die Kriterien bei ON Klausel nicht filtern / Überspringen der Zeilen statt wählen verbinden die Spalten null auf den Bedingungen beruhen würden

  2. , 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.

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