2008-09-16 12 views
2

Zum Beispiel, das besser ist:Ist es besser, zwei Felder miteinander zu verbinden oder sie jeweils mit derselben Konstante zu vergleichen?

select * from t1, t2 where t1.country='US' and t2.country=t1.country and t1.id=t2.id 

oder

select * from t1, t2 where t1.country'US' and t2.country='US' and t1.id=t2.id 

besser als in weniger Arbeit für die Datenbank, schnellere Ergebnisse.

Hinweis: Sybase, und es gibt einen Index auf beiden Tabellen von country+id.

+0

Welcher Datenbankserver? –

+0

Sybase, und es gibt einen Index auf beiden Tabellen des Landes + ID – stu

Antwort

1

Ich hatte eine ähnliche Situation wie diese und das war die Lösung, die ich zurückgegriffen:

Select * FROM t1 INNER JOIN t2 ON t1.id = t2.id UND t1.country = t2 .country UND t1.country = 'US'

Ich bemerkte, dass meine Abfrage in diesem Szenario schneller lief. Ich habe die Annahme gemacht, dass der Beitritt zur Konstante die Motorzeit speichert, weil die WHERE-Klausel am Ende ausgeführt wird. Mitmachen und dann nach "US" filtern bedeutet, dass Sie alle anderen Länder von Ihrem Tisch gezogen haben und dann die gewünschten herausfiltern mussten. Diese Methode zieht am Ende weniger Datensätze, da nur US-Datensätze gefunden werden.

0

Ich würde in Richtung nur Ihre Konstante in den Code nur einmal neigen. Es kann einen Leistungsvorteil auf die eine oder andere Weise geben, aber es ist wahrscheinlich so klein, dass der Wartungsvorteil von nur einem Parameter es übertrumpft.

1

Die richtige Antwort hängt wahrscheinlich von Ihrer SQL-Engine ab. Für MS SQL Server ist der erste Ansatz eindeutig der bessere, da dem statistischen Optimierer ein zusätzlicher Hinweis gegeben wird, der ihm helfen kann, einen besseren (optimaleren) Auflösungspfad zu finden.

1

Ich denke, es hängt von der Bibliothek und Datenbank-Engine. Jeder wird das SQL anders ausführen, und es ist nicht klar, welches Programm optimiert wird.

0

Wenn Sie die Abfrage jemals allgemeiner gestalten möchten, vielleicht durch einen Parameter für das Zielland, dann würde ich mit Ihrem ersten Beispiel fortfahren, da es nur eine einzige Änderung erfordert. Das ist weniger Angst davor, in Zukunft falsch zu liegen.

0

Ich vermute, das hängt von den Tabellen, den Daten und den Metadaten ab. Ich erwarte, dass ich Beispiele erarbeiten könnte, die Ergebnisse in beide Richtungen zeigen - Benchmark!

3

Ich glaube nicht, dass es eine globale Antwort auf Ihre Frage gibt. Es hängt von der spezifischen Abfrage ab. Sie müssten die Ausführungspläne für die beiden Abfragen vergleichen, um festzustellen, ob signifikante Unterschiede bestehen.

Ich persönlich bevorzuge die erste Form:

select * from t1, t2, wo t1.country = 'USA' und t2.country = t1.country und t1.id = t2.id

weil Wenn ich das Literal ändern möchte, ist nur eine Änderung erforderlich.

0

Die Extraktionen sollten mit jedem anständigen Optimierer übereinstimmen, aber es hängt davon ab, welche Datenbank Sie verwenden und welche Indizes in Ihrer Tabelle definiert sind.

Ich würde vorschlagen, die EXPLAIN-Funktion zu verwenden, um herauszufinden, welcher der Ausdrücke am optimalsten ist.

3

Hier sind eine Menge Faktoren, die Sie weggelassen haben. Welche Art von Datenbank ist das? Sind diese Tabellen indiziert? Wie sind sie indexiert? Wie groß sind diese Tabellen?

(Vorzeitige Optimierung ist die Wurzel aller Übel!)

Es könnte sein, dass, wenn „t1.id“ und „t2.id“ indiziert sind, der Datenbank-Engine sie basierend auf diesen Feldern miteinander verbindet, und verwendet dann den Rest der WHERE-Klausel, um Zeilen zu filtern.

Sie könnten indiziert werden, aber unglaublich kleine Tabellen, und beide passen in eine Seite des Gedächtnisses.In diesem Fall könnte die Datenbank-Engine nur einen vollständigen Scan durchführen, anstatt den Index zu laden.

Sie wissen einfach nicht wirklich, bis Sie es versuchen.

+0

Obwohl es wahr ist, ist dies nicht das Hauptanliegen der Frage, Sie werfen nur einige offensichtliche Fakten ein. – Spidey

0

denke ich, eine bessere SQL wäre:

select * from t1, t2, wo t1.id = t2.id und t1.country = 'US'

keine Notwendigkeit Es gibt über das zweite Gerät Vergleich zu "USA", es sei denn, es ist möglich, dass das Land in t2 für dieselbe ID von t1 abweichen könnte.

0

Anstatt eine implizite innere Join verwenden, würde ich explizit die Tabellen beitreten.

Da sowohl die ID-Felder als auch die Länderfelder identisch sein sollen und Sie angegeben haben, dass beide indiziert sind (ich nehme im selben Index an), würde ich beide Spalten in den Join aufnehmen, damit Sie sie verwenden können eines Index suchen statt eines Scans. Fügen Sie schließlich Ihre WHERE-Klausel hinzu.

SELECT * 
    FROM t1 
    JOIN t2 ON t1.id = t2.id AND t1.country = t2.country 
WHERE t1.country = 'US' 
 
Verwandte Themen