Pracuję w zespole SQL Server i mam nadzieję, że wyjaśnię kilka punktów w tym wątku (nie widziałem tego wcześniej, więc przepraszam, że zespół inżynierów nie zrobił tego wcześniej).
Po pierwsze, nie ma różnicy między semantyczne select count(1) from table
vs. select count(*) from table
. Zwracają te same wyniki we wszystkich przypadkach (i jest to błąd, jeśli nie). Jak zauważono w innych odpowiedziach, select count(column) from table
jest semantycznie inny i nie zawsze zwraca takie same wyniki jak count(*)
.
Po drugie, w odniesieniu do wydajności, w SQL Server (i SQL Azure) ważne są dwa aspekty: praca w czasie kompilacji i praca w czasie wykonywania. Czas pracy kompilacji to trywialnie niewielka ilość dodatkowej pracy w bieżącej implementacji. W niektórych przypadkach występuje rozszerzenie * do wszystkich kolumn, po czym następuje redukcja z powrotem do 1 kolumny wynikającej z tego, jak niektóre operacje wewnętrzne działają w wiązaniu i optymalizacji. Wątpię, aby pojawił się w jakimkolwiek mierzalnym teście i prawdopodobnie zgubiłby się w hałasie wszystkich innych rzeczy, które dzieją się pod przykryciem (takich jak automatyczne statystyki, xevent sesje, koszty magazynu zapytań, wyzwalacze itp.). To może kilka tysięcy dodatkowych instrukcji procesora. Więc, count (1) wykonuje odrobinę mniej pracy podczas kompilacji (co zwykle dzieje się raz, a plan jest buforowany w wielu kolejnych wykonaniach). Jeśli chodzi o czas realizacji, przy założeniu, że plany są takie same, nie powinno być żadnej mierzalnej różnicy. (Jeden z wcześniejszych przykładów pokazuje różnicę - najprawdopodobniej wynika to z innych czynników na komputerze, jeśli plan jest taki sam).
Co do tego, jak plan może potencjalnie być inny. Jest to bardzo mało prawdopodobne, ale jest to potencjalnie możliwe w architekturze obecnego optymalizatora. Optymalizator programu SQL Server działa jako program wyszukiwania (pomyśl: program komputerowy grający w szachy, przeszukujący różne alternatywy dla różnych części zapytania i szukający alternatywnych sposobów znalezienia najtańszego planu w rozsądnym czasie). To wyszukiwanie ma kilka ograniczeń dotyczących działania, dzięki czemu kompilacja zapytań kończy się w rozsądnym czasie. W przypadku zapytań wykraczających poza najbardziej trywialne są etapy wyszukiwania i dotyczą one transz zapytań w oparciu o koszt, jaki optymalizator uważa, że zapytanie może zostać wykonane. Istnieją 3 główne fazy wyszukiwania, a każda faza może przebiegać bardziej agresywnie (kosztownie) heurystycznie, próbując znaleźć tańszy plan niż jakiekolwiek poprzednie rozwiązanie. Ostatecznie na końcu każdej fazy podejmowany jest proces decyzyjny, który ma na celu ustalenie, czy powinien zwrócić znaleziony dotąd plan, czy też powinien kontynuować wyszukiwanie. W tym procesie wykorzystano całkowity czas do tej pory w porównaniu z szacowanym kosztem najlepszego znalezionego planu. Tak więc na różnych komputerach z różnymi prędkościami procesorów możliwe (choć rzadkie) jest uzyskanie różnych planów z powodu przekroczenia limitu czasu we wcześniejszej fazie z planem w porównaniu z przejściem do następnej fazy wyszukiwania. Istnieje również kilka podobnych scenariuszy związanych z przekroczeniem limitu czasu w ostatniej fazie i potencjalnie brakiem pamięci w bardzo, bardzo drogich zapytaniach, które zajmują całą pamięć na komputerze (zwykle nie jest to problem w 64-bitach, ale był to większy problem z powrotem na serwerach 32-bitowych). Ostatecznie, jeśli otrzymasz inny plan, wydajność w czasie wykonywania może się różnić. Ja nie
Net-net: Proszę użyć dowolnej z dwóch opcji, ponieważ nic z tego nie ma znaczenia w żadnej praktycznej formie. (Szczerze mówiąc, istnieją znacznie większe czynniki, które wpływają na wydajność SQL poza tym tematem).
Mam nadzieję, że to pomoże. Napisałem rozdział w książce o tym, jak działa optymalizator, ale nie wiem, czy jest to właściwe, aby opublikować go tutaj (ponieważ wciąż otrzymuję niewielkie opłaty licencyjne). Zamiast więc zamieszczać link do wykładu, który wygłosiłem na SQLBits w Wielkiej Brytanii na temat tego, jak optymalizator działa na wysokim poziomie, aby można było zobaczyć bardziej szczegółowo różne główne fazy wyszukiwania, jeśli chcesz aby się o tym dowiedzieć. Oto link do filmu: https://sqlbits.com/Sessions/Event6/inside_the_sql_server_query_optimizer