Количество (*) против Количество (1) - SQL Server - PullRequest
675 голосов
/ 03 августа 2009

Просто интересно, если кто-нибудь из вас, ребята, использует Count(1) над Count(*) и есть ли заметная разница в производительности или это обычная привычка, появившаяся в прошлом?

(Конкретная база данных SQL Server 2005.)

Ответы [ 12 ]

3 голосов
/ 16 мая 2018

Существует статья , показывающая, что 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 по той же теме, без упоминания базы данных, были закрыты и помечены как дублированные из этого ответа.

0 голосов
/ 22 сентября 2017

COUNT (1) существенно не отличается от COUNT (*), если вообще. Что касается вопроса о СЧЕТАХ НЕДОПУСТИМЫХ КОЛОННАХ, это может быть просто продемонстрировать разницу между COUNT (*) и COUNT () -

USE tempdb;
GO

IF OBJECT_ID( N'dbo.Blitzen', N'U') IS NOT NULL DROP TABLE dbo.Blitzen;
GO

CREATE TABLE dbo.Blitzen (ID INT NULL, Somelala CHAR(1) NULL);

INSERT dbo.Blitzen SELECT 1, 'A';
INSERT dbo.Blitzen SELECT NULL, NULL;
INSERT dbo.Blitzen SELECT NULL, 'A';
INSERT dbo.Blitzen SELECT 1, NULL;

SELECT COUNT(*), COUNT(1), COUNT(ID), COUNT(Somelala) FROM dbo.Blitzen;
GO

DROP TABLE dbo.Blitzen;
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...