Существует статья , показывающая, что COUNT(1)
на Oracle является просто псевдонимом COUNT(*)
, с подтверждением .
Я процитирую некоторые части:
Существует часть программного обеспечения базы данных, которая называется
Оптимизатор », который определяется в официальной документации как
«Встроенная база данных программного обеспечения, которая определяет наиболее эффективный способ
выполнить оператор SQL «.
Один из компонентов оптимизатора называется «трансформатор»,
чья роль состоит в том, чтобы определить, выгодно ли переписать
исходный оператор SQL в семантически эквивалентный оператор SQL
это может быть более эффективным.
Хотите посмотреть, что делает оптимизатор, когда вы пишете запрос?
используя COUNT (1)?
Пользователь с привилегией ALTER SESSION
может поставить tracefile_identifier
, включить трассировку оптимизатора и запустить COUNT(1)
select, например: SELECT /* test-1 */ COUNT(1) FROM employees;
.
После этого вам нужно локализовать файлы трассировки, что можно сделать с помощью SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Diag Trace';
. Позже вы найдете файл:
SELECT COUNT(*) “COUNT(1)” FROM “COURSE”.”EMPLOYEES” “EMPLOYEES”
Как видите, это просто псевдоним для COUNT(*)
.
Еще один важный комментарий: COUNT(*)
был действительно быстрее два десятилетия назад в Oracle, до Oracle 7.3:
Count (1) был переписан в count (*) начиная с 7.3, потому что Oracle как
Автоматически настраивать мифические высказывания. В более раннем Oracle7 оракулу пришлось
выполнить оценку (1) для каждой строки, как функцию, перед DETERMINISTIC и
Существуют недетерминированные.
Итак, два десятилетия назад счет (*) был быстрее
Для других баз данных, таких как Sql Server, их следует исследовать отдельно для каждой.
Я знаю, что этот вопрос специфичен для Sql Server, но другие вопросы по SO по той же теме, без упоминания базы данных, были закрыты и помечены как дублированные из этого ответа.