Ist es besser, um zwei Felder zusammen, oder sie sich auf die gleiche Konstante zu vergleichen?

StackOverflow https://stackoverflow.com/questions/72699

  •  09-06-2019
  •  | 
  •  

Frage

Zum Beispiel, das ist besser:

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

.
War es hilfreich?

Lösung

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

Wählen Sie * FROM t1 INNER JOIN T2 t1.id = t2.id UND t1.country = t2.country UND t1.country = 'US'

Ich habe bemerkt, dass meine Abfrage lief schneller in diesem Szenario. Ich habe die Vermutung, dass auf die ständige Verbindung des Motors eingesparte Zeit, da die WHERE-Klausel am Ende ausgeführt wird. Füge- und dann Filterung von ‚US‘ bedeutet, dass Sie nach wie vor alle anderen Länder vom Tisch gezogen und hatte dann die, die zum Ausfiltern Sie wollten. Dieses Verfahren zieht weniger Aufzeichnungen am Ende, weil es nur US Aufzeichnungen finden werden.

Andere Tipps

Ich glaube nicht, es ist eine globale Antwort auf Ihre Frage. Es hängt von der spezifischen Abfrage. Sie würden die Ausführungspläne für die beiden Abfragen zu vergleichen, um zu sehen, ob es signifikante Unterschiede.

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

, denn wenn ich die wörtlichen ändern will es nur eine Änderung erforderlich ist.

Es gibt viele Faktoren im Spiel hier, die Sie heraus verlassen haben. Was für eine Art von Datenbank ist es? Sind diese Tabellen indiziert? Wie sind sie indiziert? 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, so dass sie zusammen die Datenbank-Engine auf den Feldern basiert verbindet, und verwendet dann den Rest der WHERE-Klausel Zeilen auszufiltern.

Sie können indiziert werden, aber unglaublich kleine Tische, und beide passen in einer Seite des Speichers. In diesem Fall könnte die Datenbank-Engine machen nur einen Scan beider anstatt sich plagen den Index geladen werden.

Sie wissen einfach nicht, wirklich, bis Sie versuchen.

Die richtige Antwort hängt wahrscheinlich von der SQL-Engine. Für MS SQL Server ist der erste Ansatz eindeutig die besseren, weil das statistische Optimierungsprogramm einen zusätzlichen Anhaltspunkt gegeben, die ihn einen besseren (optimal) Auflösung Weg finden helfen können.

Ich denke, es ist an der Bibliothek und Datenbank-Engine abhängig ist. Jeder wird die SQL anders ausführen, und es ist nicht abzusehen, welche wird man optimiert werden.

Ich würde zuneigen nur Ihre Konstante im Code einmal mit. Es könnte einen Leistungsvorteil der einen oder der anderen sein, aber es ist wahrscheinlich so klein die Wartung Vorteil von nur einem Parameter übertrumpft es.

Wenn Sie jemals die Abfrage allgemeiner machen wollen, vielleicht einen Parameter für das Zielland ersetzt wird, dann würde ich mit dem ersten Beispiel gehen, da es nur eine einzige Änderung erfordert. Das ist weniger zu befürchten immer falsch in der Zukunft.

Ich vermute, dass dies auf den Tischen abhängen wird, die Daten und die Meta-Daten. Ich erwarte, dass ich konnte Beispiele arbeiten, die Ergebnisse in beiden Richtungen zeigen würde - Benchmark

Die extressions sollten mit jedem anständigen Optimierer gleichwertig sein, aber es hängt davon ab, welche Datenbank Sie verwenden und welche Indizes auf Ihrer Tabelle definiert.

Ich würde vorschlagen, die EXPLAIN-Funktion, die von Ausdrücken, um herauszufinden, ist das optimal.

Ich denke, eine bessere SQL wäre:

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

Es gibt keine Notwendigkeit, den zweiten Vergleich zu ‚US‘ zu verwenden, es sei denn, es possisble ist, dass das Land in t2 anders sein könnte als t1 für die gleiche ID.

Anstatt verwenden eine implizite innere Verknüpfung, würde ich explizit die Tabellen verknüpfen.

Da Sie sowohl die ID-Felder und Land Felder gleich sein, und Sie erwähnt, dass beide indiziert sind (I in dem gleichen Index bin Vermutung), würde ich beide Spalten sind in der Verknüpfung so können Sie Gebrauch machen ein Index suchen, anstatt eines Scans. Schließlich fügen Sie Ihre where-Klausel.

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

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