Коли ми виконуємо, select count(*) from table_name
це повертає кількість рядків.
Що робить count(1)
? Що 1
тут означає? Це те саме, що count(*)
(оскільки при виконанні дає той самий результат)?
Коли ми виконуємо, select count(*) from table_name
це повертає кількість рядків.
Що робить count(1)
? Що 1
тут означає? Це те саме, що count(*)
(оскільки при виконанні дає той самий результат)?
Відповіді:
Параметр функції COUNT - це вираз, який слід обчислювати для кожного рядка. Функція COUNT повертає кількість рядків, для яких вираз обчислюється, ненульовим значенням. (* - це спеціальний вираз, який не обчислюється, він просто повертає кількість рядків.)
Для виразу є два додаткові модифікатори: ALL і DISTINCT. Вони визначають, чи видаляються дублікати. Оскільки ALL є типовим, ваш приклад такий самий, як count (ALL 1), що означає, що дублікати зберігаються.
Оскільки вираз "1" для кожного рядка має ненульове значення, і оскільки ви не видаляєте дублікати, COUNT (1) завжди повинен повертати те саме число, що і COUNT (*).
Ось посилання, яке допоможе відповісти на ваші запитання. Коротко:
count (*) - це правильний спосіб записати його, і count (1) ОПТИМІЗОВАНО БУТИ count (*) внутрішньо - оскільки
а) підрахувати рядки, де 1 не дорівнює нулю, менш ефективно, ніж
б) підрахувати рядки
Різниця між count (*) та count (1) в Oracle?
count (*) означає, що він буде рахувати всі записи, тобто кожну клітинку, АЛЕ
count (1) означає, що він додасть один псевдо стовпець зі значенням 1 і поверне рахунок усіх записів
Це схоже на різницю між
SELECT * FROM table_name and SELECT 1 FROM table_name.
Якщо ти зробиш
SELECT 1 FROM table_name
це дасть вам число 1 для кожного рядка таблиці. Отже, так count(*)
і count(1)
забезпечить ті самі результати, що count(8)
іcount(column_name)
Різниці немає.
COUNT(1)
в основному просто підраховує постійне значення 1 стовпець для кожного рядка. Як казали інші користувачі тут, це те саме, що COUNT(0)
і COUNT(42)
. Будь-якої нецінності NULL
буде достатньо.
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
Оптимізатор Oracle, очевидно, раніше використовував помилки, внаслідок чого на підрахунок впливало те, який вибраний вами стовпець та чи він міститься в індексі, тому з’явилася конвенція COUNT (1).
SELECT COUNT(1) from <table name>
повинен робити те саме, що і
SELECT COUNT(*) from <table name>
Можливо, були або все ще існують деякі причини, чому вона буде працювати ефективніше, ніж SELECT COUNT(*)
у якійсь базі даних, але я вважаю, що це помилка в БД.
SELECT COUNT(col_name) from <table name>
однак має інше значення, оскільки враховує лише рядки з ненульовим значенням для даного стовпця.
в Oracle я вважаю, що вони мають абсолютно однакове значення
Ви можете протестувати так:
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;
Залежно від того, кого ви запитуєте, деякі люди повідомляють, що виконання select count(1) from random_table;
виконується швидше, ніж select count(*) from random_table
. Інші стверджують, що вони абсолютно однакові.
Це посилання стверджує, що різниця швидкостей між двома зумовлена ПОВНИМ СТОЛОМ та ШВИДКИМ ПОВНИМ СКАНОМ.