Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 COUNT(*) vs COUNT(ID)  [new]
_Novichok
Member

Откуда:
Сообщений: 316
Такой вот вопрос.

Часто случается нужно узнать количество строк в таблице с условием (или без условия, неважно).
В таблице присутствует первичный ключ ID.

Какой способ приоритетней: со звездочкой или с указанием, например, колонки первичного ключа?
Результат будет один и тот же, но те процессы, которые происходят внутри СУБД чем-то отличаются в том или ином случае?
16 фев 16, 13:10    [18823182]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
https://habrahabr.ru/post/271797/

Уже обсуждалось нннн-ое количество раз.
Если указали * то считаются все строки. Если указан столбец, то считаются NOT NULL
16 фев 16, 13:17    [18823230]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
_djХомяГ
Guest
В Вашем случае без разницы т к первичный ключ не может быть NULL
Тут вопрос в понимании count(*) vs count([поле])
16 фев 16, 13:17    [18823231]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
_Novichok
Member

Откуда:
Сообщений: 316
AlanDenton
Если указали * то считаются все строки. Если указан столбец, то считаются NOT NULL
ну это как раз понятно

AlanDenton
https://habrahabr.ru/post/271797/
там приводится отличие COUNT(*) от COUNT_BIG(*)

_djХомяГ
В Вашем случае без разницы т к первичный ключ не может быть NULL
и это понятно

_djХомяГ
Тут вопрос в понимании count(*) vs count([поле])
а вот это и хочу понять. Внутри сервера эти оба способа наверняка обрабатываются по-разному. Производительность как-то отличается при использовании каждого из этих способов?
16 фев 16, 13:27    [18823308]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
Glory
Member

Откуда:
Сообщений: 104760
_Novichok
Внутри сервера эти оба способа наверняка обрабатываются по-разному.

Что вас сподвигло так думать ?

_Novichok
Производительность как-то отличается при использовании каждого из этих способов?

Для этого смотрят в план выполнения запроса
16 фев 16, 13:31    [18823331]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
_djХомяГ
В Вашем случае без разницы т к первичный ключ не может быть NULL
Тут вопрос в понимании count(*) vs count([поле])
Не [поле], а выражение, если быть точным.
[Поле] - это просто частный случай выражения!
16 фев 16, 13:38    [18823381]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
_Novichok
там приводится отличие COUNT(*) от COUNT_BIG(*)

Видимо дальше пары абзацев Вы читать не стали. Прискорбно...

_Novichok
Внутри сервера эти оба способа наверняка обрабатываются по-разному. Производительность как-то отличается при использовании каждого из этих способов?

Если столбец NOT NULL, то разницы между * и явный указанием столбца - НЕТ. При условии, что некластерных индексов по этому столбцу нет.
16 фев 16, 13:40    [18823395]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
_Novichok
Внутри сервера эти оба способа наверняка обрабатываются по-разному. Производительность как-то отличается при использовании каждого из этих способов?

count = count_big + compute scalar.
Далее зависит от того, какое выражение внутри count_big, nullable или нет.
В зависимости от этого внутри сервера используются разные функции.
Вот табличка из моего доклада по агрегатам:
+
Картинка с другого сайта.

(Если интересно подробнее, можете поискать сам доклад где-то на канале российской юзер группы, вроде бы назывался Внутри оптимизатора запросов - Агрегация, там в том числе и этот вопрос разбирался).

Конкретно в вашем случае, без разницы, и внутри сервера работает одна и та же функция.

Но привыкнув писать имя колонки, вы рано или поздно наткнетесь на нуллабл колонку и получите совсем не то что ожидалось даже не с точки зрения производительности, а с точки зрения корректности. Поэтому, просто для подсчета строк, я бы рекомендовал использовать count_big(*).
16 фев 16, 13:42    [18823401]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
AlanDenton
Если столбец NOT NULL, то разницы между * и явный указанием столбца - НЕТ
Спорное утверждение.
Ибо во втором случае столбец в таблице должен существовать!
Если применить звёздочку, то будет работать всегда.
16 фев 16, 13:45    [18823416]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
iap
AlanDenton
Если столбец NOT NULL, то разницы между * и явный указанием столбца - НЕТ
Спорное утверждение.
Ибо во втором случае столбец в таблице должен существовать!
Если применить звёздочку, то будет работать всегда.
И не только существовать.
Должны быть соответствующие права доступа на этот столбец.
16 фев 16, 13:46    [18823423]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SomewhereSomehow
Конкретно в вашем случае, без разницы, и внутри сервера работает одна и та же функция.
Вот, кстати, разве нет разницы в смысле определения существования поля и прав доступа к нему?
Может, и функции, всё-таки, разные?
16 фев 16, 13:48    [18823446]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
пьяный тюлень
Member

Откуда:
Сообщений: 100
iap
iap
пропущено...
Спорное утверждение.
Ибо во втором случае столбец в таблице должен существовать!
Если применить звёздочку, то будет работать всегда.
И не только существовать.
Должны быть соответствующие права доступа на этот столбец.

А в случае * должны быть права на все столбцы таблицы.
16 фев 16, 14:20    [18823659]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
iap
Вот, кстати, разве нет разницы в смысле определения существования поля и прав доступа к нему?
Может, и функции, всё-таки, разные?
Наличие и доступ проверяется до начала выполнения компонентом Algebrizer. Если дело доходит до выполнения, то разницы нет (имена функций на картинке из WinDbg, sql server действительно их использует). Кстати, алгебраизатор раскрывает * как набор полей, если прав нет тоже будет ошибка.
+
create database test1;
go
use test1;
go
create table t1(a int not null, b int not null, c int not null);
go
create user user1 without login with default_schema = dbo;
go
grant select to user1;
go
deny select on object::dbo.t1(a) to user1;
go
execute as user = 'user1'
select count(a) from dbo.t1;
select count(b) from dbo.t1;
select count(*) from dbo.t1;
go
/*
revert;
go
use master
go
drop database test1;
*/

Msg 230, Level 14, State 1, Line 14
The SELECT permission was denied on the column 'a' of the object 't1', database 'test1', schema 'dbo'.

(1 row(s) affected)
Msg 230, Level 14, State 1, Line 16
The SELECT permission was denied on the column 'a' of the object 't1', database 'test1', schema 'dbo'.

16 фев 16, 14:40    [18823782]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
FOX75
Member

Откуда:
Сообщений: 29
SomewhereSomehow
_Novichok
Внутри сервера эти оба способа наверняка обрабатываются по-разному. Производительность как-то отличается при использовании каждого из этих способов?

count = count_big + compute scalar.
....
Поэтому, просто для подсчета строк, я бы рекомендовал использовать count_big(*).

По Вашему утверждению.. использовать count_big()-> исключается + compute scalar?
17 фев 16, 10:45    [18827888]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
FOX75
использовать count_big()-> исключается + compute scalar?


SELECT COUNT(1)
SELECT COUNT_BIG(1)

Сравните планы и Вы сами ответите на свой вопрос.
17 фев 16, 10:59    [18827982]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
AlanDenton
https://habrahabr.ru/post/271797/

Уже обсуждалось нннн-ое количество раз.
Если указали * то считаются все строки. Если указан столбец, то считаются NOT NULL


Должно обсуждаться * раз
17 фев 16, 12:29    [18828783]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
FOX75
По Вашему утверждению.. использовать count_big()-> исключается + compute scalar?

Исключается операция convert_implicit, которая помещается в оператор Compute Scalar. Со спокойной совестью можете использовать и count, и count_big - в зависимости от того, какой тип данных вам надо получить на выходе.
17 фев 16, 14:29    [18829775]     Ответить | Цитировать Сообщить модератору
 Re: COUNT(*) vs COUNT(ID)  [new]
FOX75
Member

Откуда:
Сообщений: 29
SomewhereSomehow
FOX75
По Вашему утверждению.. использовать count_big()-> исключается + compute scalar?

Исключается операция convert_implicit, которая помещается в оператор Compute Scalar. Со спокойной совестью можете использовать и count, и count_big - в зависимости от того, какой тип данных вам надо получить на выходе.

Спасиб за разъяснения
18 фев 16, 10:16    [18833529]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить