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ą?
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ą?
Odpowiedzi:
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(*)
, COUNT(<constant>)
i COUNT(<column name>)
że wszystkie trzy mogą być poprzedzone znakiem ALL
lub DISTINCT
(domyślnie ALL
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 jak COUNT(*)
. 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:
select count(*) from any_table
jest łatwo czytelne i oczywiste, co próbujesz zrobić, i
select count(any_non_null_column) from any_table
jest trudniejszy do odczytania, ponieważ
any_non_null_column
tak naprawdę jest egzekwowane jakonot null
Krótko mówiąc, użyjcount(*)
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 (*)?
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:
SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;
To sprawia, że funkcja COUNT działa na tym samym poziomie, niezależnie od silnika pamięci lub RDBMS.
count(*)
jest używana.