Ich habe einen Fall, in dem die Verwendung eines JOIN oder eines IN die richtigen Ergebnisse liefert ... Was hat normalerweise eine bessere Leistung und warum? Wie stark hängt es davon ab, welchen Datenbankserver Sie ausführen? (Zu Ihrer Information, ich benutze MSSQL)
sql
sql-server
performance
tsql
Polaris878
quelle
quelle
Antworten:
Im Allgemeinen
IN
undJOIN
gibt verschiedene Abfragen , die zu unterschiedlichen Ergebnissen führen können.ist nicht dasselbe wie
, es
b.col
sei denn, es ist einzigartig.Dies ist jedoch das Synonym für die erste Abfrage:
Wenn die Verbindungsspalte
UNIQUE
als solche gekennzeichnet ist, ergeben beide Abfragen den gleichen Plan inSQL Server
.Wenn nicht,
IN
ist es schneller alsJOIN
einDISTINCT
.Weitere Informationen zur Leistung finden Sie in diesem Artikel in meinem Blog:
IN
vs.JOIN
vs.EXISTS
quelle
IN
impliziertDISTINCT
.SQL Server
ist klug genug, um es zu bemerken, und generiert für beide Abfragen dieselben Pläne. Ich bin mir jedoch nicht sicher, wie sich andereRDBMS
verhalten werden.Komisch, dass Sie das erwähnen, ich habe einen Blog-Beitrag zu diesem Thema verfasst.
Siehe Oracle vs MySQL vs SQL Server: Aggregation vs Joins
Kurze Antwort: Sie müssen es testen und einzelne Datenbanken variieren stark.
quelle
Das ist ziemlich schwer zu sagen - um wirklich herauszufinden, welches besser funktioniert, müssten Sie die Ausführungszeiten tatsächlich profilieren.
Als allgemeine Faustregel denke ich, wenn Sie Indizes für Ihre Fremdschlüsselspalten haben und wenn Sie nur (oder meistens) INNER JOIN-Bedingungen verwenden, ist der JOIN etwas schneller.
Sobald Sie jedoch OUTER JOIN verwenden oder Fremdschlüsselindizes fehlen, ist IN möglicherweise schneller.
Marc
quelle
Eine interessante Beschreibung der logischen Unterschiede: SQL Server: JOIN vs IN vs EXISTS - der logische Unterschied
Ich bin mir ziemlich sicher, dass unter der Annahme, dass die Relationen und Indizes beibehalten werden, ein Join insgesamt eine bessere Leistung erbringt (es wird mehr Aufwand betrieben, mit dieser Operation zu arbeiten als mit anderen). Wenn Sie konzeptionell darüber nachdenken, ist es der Unterschied zwischen 2 Abfragen und 1 Abfrage.
Sie müssen es an den Query Analyzer anschließen und es ausprobieren, um den Unterschied zu erkennen. Sehen Sie sich auch den Abfrageausführungsplan an und versuchen Sie, die Schritte zu minimieren.
quelle
Dieser Thread ist ziemlich alt, wird aber immer noch oft erwähnt. Für meinen persönlichen Geschmack ist es etwas unvollständig, da es eine andere Möglichkeit gibt, die Datenbank mit dem Schlüsselwort EXISTS abzufragen, das ich häufig als schneller empfand.
Wenn Sie also nur an Werten aus Tabelle a interessiert sind, können Sie diese Abfrage verwenden:
Der Unterschied kann sehr groß sein, wenn col nicht indiziert ist, da die Datenbank nicht alle Datensätze in b finden muss, die den gleichen Wert in col haben, sondern nur den allerersten. Wenn es keinen Index für b.col gibt und viele Datensätze im Ba-Tabellenscan die Folge sein könnten. Mit IN oder einem JOIN wäre dies ein vollständiger Tabellenscan, mit EXISTS wäre dies nur ein teilweiser Tabellenscan (bis der erste übereinstimmende Datensatz gefunden wird).
Wenn es in b viele Datensätze gibt, die denselben Spaltenwert haben, verschwenden Sie auch viel Speicher, um alle diese Datensätze in einen temporären Bereich zu lesen, um festzustellen, ob Ihre Bedingung erfüllt ist. Mit vorhanden kann dies in der Regel vermieden werden.
Ich habe EXISTS oft schneller als IN gefunden, selbst wenn es einen Index gibt. Dies hängt vom Datenbanksystem (dem Optimierer), den Daten und nicht zuletzt von der Art des verwendeten Index ab.
quelle
Die Implementierung jeder Datenbank, aber Sie können wahrscheinlich davon ausgehen, dass sie alle gängigen Probleme mehr oder weniger auf die gleiche Weise lösen. Wenn Sie MSSQL verwenden, sehen Sie sich den generierten Ausführungsplan an. Sie können dies tun, indem Sie den Profiler und die Ausführungspläne aktivieren. Dadurch erhalten Sie eine Textversion, wenn Sie den Befehl ausführen.
Ich bin nicht sicher, welche Version von MSSQL Sie verwenden, aber Sie können eine grafische Version in SQL Server 2000 im Abfrageanalysator abrufen. Ich bin sicher, dass diese Funktionalität in späteren Versionen in SQL Server Studio Manager lauert.
Schauen Sie sich den Ausführungsplan an. Vermeiden Sie Tabellenscans so weit wie möglich, es sei denn, Ihre Tabelle ist natürlich klein. In diesem Fall ist ein Tabellenscan schneller als die Verwendung eines Index. Informieren Sie sich über die verschiedenen Verknüpfungsvorgänge, die jedes Szenario erzeugt.
quelle
Das Optimierungsprogramm sollte intelligent genug sein, um bei normalen Abfragen in beiden Fällen das gleiche Ergebnis zu erzielen. Überprüfen Sie den Ausführungsplan und sie sollten Ihnen das gleiche geben. Wenn nicht, würde ich normalerweise den JOIN als schneller betrachten. Alle Systeme sind jedoch unterschiedlich, daher sollten Sie den Code auf Ihrem System profilieren, um sicherzugehen.
quelle