Wie der Titel schon sagt ... Ich versuche, den schnellsten Weg mit dem geringsten Aufwand herauszufinden, um festzustellen, ob ein Datensatz in einer Tabelle vorhanden ist oder nicht.
Beispielabfrage:
SELECT COUNT(*) FROM products WHERE products.id = ?;
vs
SELECT COUNT(products.id) FROM products WHERE products.id = ?;
vs
SELECT products.id FROM products WHERE products.id = ?;
Angenommen, die ?
wird ausgetauscht mit 'TB100'
... Sowohl die erste als auch die zweite Abfrage geben genau das gleiche Ergebnis zurück (sagen wir ... 1
für diese Konversation). Die letzte Abfrage wird 'TB100'
wie erwartet zurückgegeben oder nichts, wenn die id
nicht in der Tabelle vorhanden ist.
Der Zweck ist herauszufinden, ob das id
in der Tabelle ist oder nicht. Wenn nicht, fügt das Programm als nächstes den Datensatz ein. Wenn dies der Fall ist, überspringt das Programm ihn oder führt eine UPDATE-Abfrage basierend auf einer anderen Programmlogik außerhalb des Bereichs dieser Frage durch.
Was ist schneller und hat weniger Overhead? (Dies wird zehntausend Mal pro Programmlauf wiederholt und mehrmals täglich ausgeführt.)
(Ausführen dieser Abfrage für M $ SQL Server von Java über den von M $ bereitgestellten JDBC-Treiber)
quelle
if exists(select null from products where id = @id)
; wenn in einer Abfrage direkt von einem Client aufgerufenselect case when exists (...) then 1 else 0 end
.Antworten:
SELECT TOP 1 products.id FROM products WHERE products.id = ?;
übertrifft alle Ihre Vorschläge, da die Ausführung beendet wird, nachdem der erste Datensatz gefunden wurde.quelle
id
nicht PK". Also +1 zu deinem Rat.EXISTS
(oderNOT EXISTS
) wurde speziell entwickelt, um zu überprüfen, ob etwas vorhanden ist, und sollte daher die beste Option sein (und ist). Es wird in der ersten übereinstimmenden Zeile angehalten, sodass keineTOP
Klausel erforderlich ist und keine Daten ausgewählt werden, sodass die Spaltengröße keinen Overhead verursacht. Sie können sicher verwendenSELECT *
hier - nicht anders alsSELECT 1
,SELECT NULL
oderSELECT AnyColumn
... (man kann sogar einen ungültigen Ausdruck wie verwendenSELECT 1/0
und es wird nicht brechen) .quelle
Exists
arbeitetselect
so, dass es beendet wird, sobald eine Zeile gefunden wird. Darüber hinaus wird lediglich das Vorhandensein eines Datensatzes und nicht der tatsächlichen Werte im Datensatz vermerkt, sodass die Zeile nicht mehr von der Festplatte geladen werden muss (vorausgesetzt, die Suchkriterien sind indiziert). Was den Overhead vonif
- angeht, müssen Sie diese winzige Zeit sowieso verbringen.select top
oderexists
; Wenn sie nicht vorhanden sind, muss die SQL-Engine einen Tabellenscan durchführen. Dies ist die am wenigsten wünschenswerte Tabellensuchoption. Wenn Sie nicht berechtigt sind, Indizes zu erstellen, müssen Sie den technischen Mitarbeitern auf der anderen Seite mitteilen, ob sie diese automatisch anpassen oder von Ihnen erwarten, dass Sie Indizes vorschlagen.SELECT CASE WHEN EXISTS(..) THEN 1 ELSE 0 END;
Nichts kann schlagen -
Sie müssen nicht zählen, um zu wissen, ob Daten in der Tabelle vorhanden sind. Und verwenden Sie keinen Alias, wenn dies nicht erforderlich ist.
quelle
id
ist kein Primärschlüssel. Auch wenn Sie nicht zählen, müssen Sie dennoch alle übereinstimmenden Datensätze finden, möglicherweise Tausende davon. Über Aliasing - Code ist ständig in Arbeit. Sie wissen nie, wann Sie zurück müssen. Aliasing hilft, dumme Laufzeitfehler zu vermeiden. Beispielsweise ist ein eindeutiger Spaltenname , für den kein Alias erforderlich ist, nicht mehr eindeutig, da jemand eine gleichnamige Spalte in einer anderen verknüpften Tabelle erstellt hat.aliasing
. Richtiger Begriff istqualifying
. Hier ist eine längere Erklärung von Alex Kuznetzov . Informationen zu Abfragen einzelner Tabellen - es handelt sich jetzt um einzelne Tabellen . Aber später, wenn ein Fehler entdeckt wird und Sie versuchen, die Flut zu halten, ist der Client nervös. Sie setzen sich an einen anderen Tisch, um eine Fehlermeldung zu erhalten - eine leicht korrigierbare Meldung, aber nicht in diesem schweißtreibenden Moment, in der ein kleiner Schlaganfall auftritt - und Sie korrigieren die Fehler beim Erinnern daran, niemals eine Kolumne zu verlassen ...Dieser Ansatz gibt einen Booleschen Wert für Sie zurück.
quelle
Sie können auch verwenden
quelle
Denken Sie nicht, dass es bereits jemand erwähnt hat, aber wenn Sie sicher sind, dass sich die Daten unter Ihnen nicht ändern, können Sie auch den NoLock-Hinweis anwenden, um sicherzustellen, dass sie beim Lesen nicht blockiert werden.
quelle
Dies ist die relationale Datenbanklösung, die in allen Datenbanken funktioniert.
quelle
Im Folgenden finden Sie die einfachste und schnellste Methode, um festzustellen, ob ein Datensatz in der Datenbank vorhanden ist oder nicht. Gut, dass er in allen relationalen DBs funktioniert
quelle
quelle
Ich habe dies in der Vergangenheit verwendet und es ist kein vollständiger Tabellenscan erforderlich, um festzustellen, ob etwas vorhanden ist. Es ist super schnell ...
quelle
Für diejenigen, die aus MySQL- oder Oracle-Hintergrund darauf stoßen - MySQL unterstützt die LIMIT-Klausel, um eine begrenzte Anzahl von Datensätzen auszuwählen, während Oracle ROWNUM verwendet.
quelle