Wydaje mi się, że pamiętam, że (w Oracle) istnieje różnica między wypowiadaniem select count(*) from any_table
a select count(any_non_null_column) from any_table
.
Jakie są różnice między tymi dwoma stwierdzeniami, jeśli takie istnieją?
Oznacza to, COUNT(any_non_null_column)
że da to samo co COUNT(*)
oczywiście, ponieważ nie ma wartości NULL powodujących różnice.
Zasadniczo COUNT(*)
powinno być lepiej, ponieważ można użyć dowolnego indeksu, ponieważ COUNT(column_or_expression)
może nie być indeksowany lub SARGable
Z ANSI-92 (poszukaj „ Scalar expressions 125
”)
Walizka:
a) Jeśli określono COUNT (*), wówczas wynikiem jest liczność T.
b) W przeciwnym razie niech TX będzie tabelą jednokolumnową, która jest wynikiem zastosowania <wyrażenie wartości> do każdego wiersza T i wyeliminowania wartości zerowych. Jeśli jedna lub więcej wartości zerowych zostanie wyeliminowanych, wówczas zostanie spełniony warunek ukończenia: ostrzeżenie - wartość zerowa wyeliminowana w funkcji set.
Te same zasady dotyczą przynajmniej SQL Server i Sybase
Uwaga: COUNT (1) jest taki sam jak COUNT (*), ponieważ 1 jest wyrażeniem, które nie ma wartości null.
count(*)
jest używana.COUNT(*)
,COUNT(<constant>)
iCOUNT(<column name>)
że wszystkie trzy mogą być poprzedzone znakiemALL
lubDISTINCT
(domyślnieALL
jeśli pominięte). Zastanawiam się tylko, jakiego wyrażenia można użyć w tym, co mówisz_or_expression
?COUNT(1)
gdy jako bezużyteczny przykład, jest taki sam jakCOUNT(*)
.COUNT(CASE WHEN a>b THEN 1 END)
jako przykład zliczający wiersze, w których a> b.W każdej ostatniej (tj. 8.x + ) wersji Oracle robią to samo . Innymi słowy, jedyną różnicą jest semantyczna:
jest łatwo czytelne i oczywiste, co próbujesz zrobić, i
jest trudniejszy do odczytania, ponieważ
any_non_null_column
tak naprawdę jest egzekwowane jakonot null
Krótko mówiąc, użyj
count(*)
źródło
W najnowszej wersji rzeczywiście nie ma różnicy między liczbą (*) a liczbą ( dowolną kolumną niepustą ), z naciskiem na niepustą :-) Nawiasem mówiąc, omawiałem ten temat postem na blogu: Czy liczba (kol) jest lepsza niż liczba (*)?
źródło
W książce Oracle8i Certified Professional DBA Certification Exam Guide (ISBN 0072130601) , strona 78 mówi, że COUNT (1) faktycznie będzie działać szybciej niż COUNT (*), ponieważ w grę wchodzą określone mechanizmy sprawdzania słownika danych dla zerowalności każdej kolumny (lub przynajmniej pierwsza kolumna z zerową wartością zerową) przy użyciu COUNT (*) . COUNT (1) omija te mechanizmy.
Kody MySQL dla „SELECT COUNT (1) w tblname;” w tabelach MyISAM, czytając nagłówek tabeli dla liczby tabel. InnoDB liczy się za każdym razem.
Aby sprawdzić, czy COUNT (1) będzie działać szybciej niż COUNT (*) w sposób agnostyczny z bazą danych, po prostu uruchom następujące czynności i oceń sam czas działania:
To sprawia, że funkcja COUNT działa na tym samym poziomie, niezależnie od silnika pamięci lub RDBMS.
źródło