Beim Lesen einer Dokumentation zur SQL-Optimierung habe ich Folgendes festgestellt:
SELECT COUNT(*)
::
- Zählt die Anzahl der Zeilen.
- Wird häufig nicht ordnungsgemäß verwendet, um das Vorhandensein eines Datensatzes zu überprüfen.
Ist das SELECT COUNT(*)
wirklich so schlimm?
Was ist der richtige Weg, um das Vorhandensein eines Datensatzes zu überprüfen?
sql
optimization
query-optimization
systempuntoout
quelle
quelle
Ich würde es vorziehen, die Count-Funktion überhaupt nicht zu verwenden:
Wenn Sie beispielsweise überprüfen möchten, ob ein Benutzer vorhanden ist, bevor Sie ihn in die Datenbank einfügen, kann die Abfrage folgendermaßen aussehen:
quelle
Sie können verwenden:
Wenn kein Datensatz vorhanden ist, der der Bedingung entspricht, ist das resultierende Datensatzset leer.
quelle
Die anderen Antworten sind recht gut, aber es wäre auch nützlich, sie hinzuzufügen
LIMIT 1
(oder das Äquivalent , um die Überprüfung unnötiger Zeilen zu verhindern.quelle
wird alle Datensätze durchlaufen. Dies ist der Grund, warum es schlecht ist, für die Existenz von Aufzeichnungen zu verwenden.
ich würde ... benutzen
Nachdem 1 Datensatz gefunden wurde, wird die Schleife beendet.
quelle
SELECT TOP 1
wird es endet tatsächlich nach einer zu finden , oder ist es weiterhin alle in der Lage zu finden sein zu sagen , welches ist TOP?IF EXISTS (SELECT TOP 1 1 FROM ... WHERE ..)
Sie können verwenden:
oder
Dies wird effizienter sein als
SELECT *
wenn Sie einfach den Wert 1 für jede Zeile und nicht für alle Felder auswählen.Es gibt auch einen subtilen Unterschied zwischen COUNT (*) und COUNT (Spaltenname):
COUNT(*)
zählt alle Zeilen, einschließlich NullenCOUNT(column name)
zählt nur Nicht-Null-Vorkommen des Spaltennamensquelle
count(1)
undcount(*)
ist nur im hirntoten DBMS unterschiedlich.count(*)
und gibtcount(1)
. Ob dies bei anderen DBMS der Fall ist , kann ich nicht sagen.Sie können verwenden:
Verwenden
select 1
diese , um die Überprüfung unnötiger Felder zu verhindern.Verwenden Sie
LIMIT 1
diese Option , um die Überprüfung unnötiger Zeilen zu verhindern.quelle
Ich benutze diesen Weg:
quelle
Andere Option:
quelle