Kiedy wykonujemy select count(*) from table_name
, zwraca liczbę wierszy.
Co robi count(1)
? Co to 1
oznacza? Czy to to samo, co count(*)
(ponieważ daje taki sam wynik przy wykonaniu)?
Kiedy wykonujemy select count(*) from table_name
, zwraca liczbę wierszy.
Co robi count(1)
? Co to 1
oznacza? Czy to to samo, co count(*)
(ponieważ daje taki sam wynik przy wykonaniu)?
Odpowiedzi:
Parametr 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 oceniane, 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 zachowywane są duplikaty.
Ponieważ wyrażenie „1” ma wartość różną od null dla każdego wiersza, a ponieważ nie usuwasz duplikatów, COUNT (1) powinien zawsze zwracać tę samą liczbę co COUNT (*).
Oto link , który pomoże odpowiedzieć na Twoje pytania. W skrócie:
count (*) jest poprawnym sposobem zapisu, a count (1) jest ZOPTYMALIZOWANE, ABY BYĆ count (*) wewnętrznie - ponieważ
a) policz wiersze, w których 1 nie jest zerowe, jest mniej wydajne niż
b) policz wiersze
Różnica między count (*) a count (1) w Oracle?
count (*) oznacza, że policzy wszystkie rekordy, tj. każdą komórkę ALE
count (1) oznacza, że doda jedną pseudokolumnę o wartości 1 i zwróci liczbę wszystkich rekordów
Jest to podobne do różnicy między
SELECT * FROM table_name and SELECT 1 FROM table_name.
Jeśli zrobisz
SELECT 1 FROM table_name
da ci numer 1 dla każdego wiersza w tabeli. Więc tak count(*)
i count(1)
zapewni takie same wyniki, jak będzie count(8)
lubcount(column_name)
Nie ma różnicy.
COUNT(1)
to po prostu zliczanie stałej wartości 1 kolumny dla każdego wiersza. Jak powiedzieli inni użytkownicy tutaj, jest to to samo, co COUNT(0)
lub COUNT(42)
. NULL
Wystarczy jakakolwiek niewartość.
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Optymalizator Oracle najwyraźniej używał błędów, które spowodowały, że na liczbę wpłynęła wybrana kolumna i czy znajdowała się w indeksie, więc powstała konwencja COUNT (1).
SELECT COUNT(1) from <table name>
powinien zrobić dokładnie to samo, co
SELECT COUNT(*) from <table name>
Być może istniały lub nadal istnieją powody, dla których będzie działać lepiej niż SELECT COUNT(*)
w przypadku niektórych baz danych, ale uważam, że to błąd w bazie danych.
SELECT COUNT(col_name) from <table name>
ma jednak inne znaczenie, ponieważ zlicza tylko wiersze z wartością inną niż null dla danej kolumny.
w wyroczni uważam, że mają one dokładnie to samo znaczenie
Możesz przetestować w ten sposób:
create table test1(
id number,
name varchar2(20)
);
insert into test1 values (1,'abc');
insert into test1 values (1,'abc');
select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;
W zależności od tego, kogo zapytasz, niektóre osoby zgłaszają, że wykonywanie select count(1) from random_table;
działa szybciej niż select count(*) from random_table
. Inni twierdzą, że są dokładnie tacy sami.
To łącze twierdzi, że różnica prędkości między 2 jest spowodowana PEŁNYM SKANOWANIEM TABELI a SZYBKIM PEŁNYM SKANOWANIEM.