Podczas czytania dokumentacji związanej z tuningiem SQL znalazłem:
SELECT COUNT(*)
:
- Liczy liczbę wierszy.
- Często jest niewłaściwie wykorzystywany do weryfikacji istnienia zapisu.
Czy to SELECT COUNT(*)
naprawdę takie złe?
Jaki jest właściwy sposób sprawdzenia istnienia zapisu?
sql
optimization
query-optimization
systempuntoout
źródło
źródło
Wolałbym wcale nie używać funkcji Count:
Na przykład, jeśli chcesz sprawdzić, czy użytkownik istnieje przed wstawieniem go do bazy danych, zapytanie może wyglądać następująco:
źródło
Możesz użyć:
Jeśli nie ma rekordu pasującego do warunku, wynikowy zestaw rekordów jest pusty.
źródło
Inne odpowiedzi są dość dobre, ale warto również dodać
LIMIT 1
(lub odpowiednik , aby zapobiec sprawdzaniu niepotrzebnych wierszy.źródło
zapętli wszystkie rekordy. To jest powód, dla którego używanie rekordu jest złe.
użyłbym
Po znalezieniu 1 rekordu zakończy pętlę.
źródło
SELECT TOP 1
, czy rzeczywiście zakończy się po znalezieniu jednego, czy też nadal znajdzie wszystko, aby móc powiedzieć, który jest NA GÓRZE?IF EXISTS (SELECT TOP 1 1 FROM ... WHERE ..)
Możesz użyć:
lub
Będzie to bardziej wydajne niż
SELECT *
ponieważ po prostu wybierasz wartość 1 dla każdego wiersza, a nie dla wszystkich pól.Istnieje również subtelna różnica między COUNT (*) a COUNT (nazwa kolumny):
COUNT(*)
policzy wszystkie wiersze, w tym nullCOUNT(column name)
będzie liczyć tylko niepuste wystąpienia nazwy kolumnyźródło
count(1)
icount(*)
będzie różna tylko w najbardziej pozbawionym mózgu DBMS.count(*)
icount(1)
. Czy tak jest w przypadku innych DBMS, nie mogę powiedzieć.Możesz użyć:
Służy
select 1
do zapobiegania sprawdzaniu niepotrzebnych pól.Służy
LIMIT 1
do zapobiegania sprawdzaniu niepotrzebnych wierszy.źródło
Używam w ten sposób:
źródło
Inna opcja:
źródło