Najlepsza odpowiedź
Jest już kilka dobrych odpowiedzi, ale niestety niektóre się mylą.
1 w COUNT (1) jest po prostu dosłownym wyrażeniem stałym, nie ma nic wspólnego z kolumną 1 tabeli. Poda tę samą odpowiedź co COUNT (*) i ma ten sam plan wykonania. Zapytanie zliczy wiersze w najmniejszym indeksie nieklastrowym, aby zminimalizować wymagane operacje we / wy.
COUNT (Col) (dla kolumny dopuszczającej wartość null) zostanie znalezione przez zliczenie wierszy w najmniejszym indeksie zawierającym Col jeśli nie ma go w żadnym indeksie, wymagane jest skanowanie tabeli. Jeśli Col znajduje się w kluczu lub indeksie klastrowym, jest on również częścią każdego innego indeksu, więc skanowany będzie najmniejszy indeks nieklastrowy zamiast skanowania tabeli klastrowej.
Jeśli kolumna docelowa NIE ma wartości NULL, wówczas COUNT (Col) jest identyczne z COUNT (*) i zostanie ponownie znalezione przez skanowanie najmniejszego indeksu nieklastrowego, nawet jeśli Col nie ma w żadnym indeksie.
Te instrukcje są oparte na szacunkowych planach wykonania różnych zapytań na serwera SQL 2014, optymalizatory zapytań dla starszych lub nowszych wersji mogą działać inaczej. Może się okazać, że nauka czytania planów wykonania może nauczyć cię znacznie więcej o sposobie wykonywania zapytań niż próba ustalenia, która odpowiedź zamieszczona tutaj jest dokładniejsza.
Odpowiedź
Parametr do funkcji COUNT jest wyrażeniem, które ma być obliczane dla każdego wiersza. Funkcja COUNT zwraca liczbę wierszy, dla których wynikiem wyrażenia jest wartość różna od null. (* to specjalne wyrażenie, które nie jest obliczane, po prostu zwraca liczbę wierszy.)
Istnieją dwa dodatkowe modyfikatory wyrażenia: ALL i DISTINCT. Określają one, czy duplikaty są odrzucane. Ponieważ ALL jest wartością domyślną, Twój przykład jest taki sam jak count (ALL 1), co oznacza, że duplikaty są zachowywane.
Ponieważ wyrażenie „1” ma wartość różną od null dla każdego wiersza, a ponieważ nie usuwają duplikatów, COUNT (1) powinno zawsze zwracać tę samą liczbę co COUNT (*).