Frage

Ich schreibe ein Programm, das eine E-Mail aus auf einem Client-spezifische Ortszeit sendet. Ich habe eine .NET-Methode, die eine Zeitzone und Uhrzeit und Zielzeitzone nimmt und gibt die Zeit in dieser Zeitzone. Also meine Methode jede unterschiedliche Zeitzone in der Datenbank zu wählen ist, zu prüfen, ob es die richtige Zeit mit der Methode ist, dann wählen Sie jeden Client aus der Datenbank mit dieser Zeitzone (n).

Die Abfrage wird wie eine von ihnen suchen. Beachten Sie die Reihenfolge festlegen, des Ergebnisses spielt keine Rolle, so dass eine Vereinigung wäre in Ordnung. Welche läuft schneller, oder tun sie wirklich das Gleiche?

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)

oder

SELECT email FROM tClient WHERE timezoneID = 1
    UNION ALL SELECT email FROM tClient WHERE timezoneID = 4
    UNION ALL SELECT email FROM tCLIENT WHERE timezoneID = 9

Edit:. TimeZoneID ist ein Fremdschlüssel zu tTimezone, eine Tabelle mit Primärschlüssel TimeZoneID und varchar (20) Feld Timezone Auch ging ich mit WHERE IN da ich nicht der Analysator wie Öffnung fühlen.

Edit 2: verarbeitet Abfrage 200k Zeilen in unter 100 ms, damit an dieser Stelle ich fertig bin

.
War es hilfreich?

Lösung

Hey! Diese Abfragen sind nicht gleichwertig.

Die Ergebnisse werden gleich sein, nur wenn angenommen wird, dass eine E-Mail nur für die eine Zeitzone gehört. Natürlich ist es jedoch SQL-Engine nicht weiß, dass und versucht Duplizitäten zu entfernen. So ist die erste Abfrage sollte schneller sein.

Immer UNION ALL verwenden, es sei denn, Sie wissen, warum Sie wollen UNION verwenden.

Wenn Sie nicht sicher sind, was für einen Unterschied sehen ist Vorversion Frage

.

Andere Tipps

Für die meisten Datenbank-bezogene Leistungs Fragen, die wirkliche Antwort ist es zu laufen und zu analysieren, was die DB für die Datenmenge der Fall ist. Führen Sie eine Erklärung Plan oder verfolgen, um zu sehen, ob Ihre Anfrage wird die richtigen Indizes schlagen oder erstellen Indizes, falls erforderlich.

ich wahrscheinlich mit dem ersten mit der IN-Klausel gehen würde, da diese die meisten Semantik tragen, was Sie wollen. Die TimeZoneID scheint wie ein Primärschlüssel auf einige Zeitzone Tisch, so sollte es ein Fremdschlüssel auf E-Mail und indiziert sein. Je nach DB-Optimierer, würde ich denke, es sollte auf dem Fremdschlüssel-Index einen Index-Scan tun.

Meine erste Vermutung wäre, dass

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)
werden schneller sein, da es nur einzelne Scan der Tabelle erfordert die Ergebnisse zu finden, aber ich schlage vor, den Ausführungsplan für beiden Abfragen zu überprüfen.

I MS SQL Query Analyzer nicht zur Hand haben, um tatsächlich meine Hypothese zu überprüfen, denken aber, dass WHERE IN Variante schneller sein würde, weil mit UNION Server 3 Tabellen-Scans zu tun haben, während mit WHERE IN nur eine benötigen. Wenn Sie Ausführungsüberprüfung Query Analyzer Pläne für beide Fragen haben.

Im Internet kann man oft Vorschläge stoßen bei der Verwendung zu vermeiden, wo, aber das bezieht sich auf Fälle, in denen eine gebrauchte Unterabfragen. So ist dieser Fall außerhalb des Geltungsbereichs dieser Empfehlung und zusätzlich ist leichter zu lesen und zu verstehen.

Ich denke, dass es einige sehr wichtige Informationen in der Frage fehlt. Zunächst einmal ist es von großer Bedeutung Wetter TimeZoneID ist indiziert ist oder nicht, ist es ein Teil des Primärschlüssels usw. würde ich jedem empfehlen einen Blick auf den Analysator zu haben, aber nach meiner Erfahrung die WHERE-Klausel schneller sein sollte, vor allem mit ein Index. Die Logik ist so etwas wie, gibt es einen zusätzlichen Overhead in der Union-Abfrage, die Überprüfung Typen, Spaltennummern in jedem usw.

In dem Buch "SQL Performance Tuning", fanden die Autoren, dass die UNION-Abfragen in allen 7 DBMS langsamer waren‘, die sie getestet (SQL Server 2000, Sybase ASE 12.5, Oracle 9i, DB2 usw.): http://books.google .com / Bücher? id = 3H9CC54qYeEC & pg = PA32 & VQ = UNION & dq = sql + Leistung + Tuning & source = gbs_search_s & sig = ACfU3U18uYZWYVHxr2I3uUj8kmPz9RpmiA # PPA33, M1

Die spätere DBMS‘diesen Unterschied haben kann weg optimiert, aber es ist zweifelhaft. die UNION Methode auch ist viel länger und schwieriger zu halten (was, wenn Sie ein drittes wollen?) gegenüber dem IN.

Es sei denn, Sie haben guten Grund UNION zu verwenden, Stick mit der OR / IN Verfahren.

Einige DBMS Query Optimizer ändern Sie Ihre Abfrage es effizienter zu machen, so dass je nach dem DBMS Ihre verwenden, sollten Sie wahrscheinlich nicht.

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