Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
countnoncount
Guest
Есть ли какая-нибудь разница в коде:

select count(*) from a

--и 

select count(1) from a

--или как вариант

select sum(1) from a



Для современного движка бд MS SQL (версии выше 2008 R2)?

Аналогично и с exists:

exists(select * from a)

exists(select 1 from a)
10 дек 14, 11:24    [16976175]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
countnoncount,

есть.
COUNT(*) и COUNT(выражение) - это разные функции.
10 дек 14, 11:29    [16976208]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Выражение в SELECXTе EXISTS() может ссылаться только на существующие поля таблиц.
Других ограничений нет. Например:
EXISTS(SELECT 1/0 FROM a)
10 дек 14, 11:32    [16976225]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
countnoncount
Guest
iap
countnoncount,

есть.
COUNT(*) и COUNT(выражение) - это разные функции.


Поясните пожалуйста.
Функция count в моих примерах делает одно и тоже, выдает одно и тоже значение.
Если посмотреть планы выполнения, то все одинаково.
Что лучше использовать, есть ли какая-нибудь разница?
10 дек 14, 11:40    [16976296]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
countnoncount
iap
countnoncount,

есть.
COUNT(*) и COUNT(выражение) - это разные функции.


Поясните пожалуйста.
Функция count в моих примерах делает одно и тоже, выдает одно и тоже значение.
Если посмотреть планы выполнения, то все одинаково.
Что лучше использовать, есть ли какая-нибудь разница?
COUNT(*) всегда ает количество строк в группе.
COUNT(выражение) возвращает количество строк в группе, для которых выражение IS NOT NULL.

У Вас хелп не работает?
10 дек 14, 11:49    [16976382]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
iap
countnoncount
пропущено...


Поясните пожалуйста.
Функция count в моих примерах делает одно и тоже, выдает одно и тоже значение.
Если посмотреть планы выполнения, то все одинаково.
Что лучше использовать, есть ли какая-нибудь разница?
COUNT(*) всегда ает количество строк в группе.
COUNT(выражение) возвращает количество строк в группе, для которых выражение IS NOT NULL.

У Вас хелп не работает?
Можно сказать иначе: все агрегатные функции игнорируют строки, для которых аргумент IS NULL.
За исключением COUNT(*)
10 дек 14, 11:52    [16976401]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
countnoncount
Guest
iap,

вы просто отвечаете на какой-то свой вопрос, не мой.
Код у меня выдает один и тот же результат.
Есть ли какое-нибудь отличие в коде в плане быстродействия\предпочтительности запроса. Если есть то почему.
10 дек 14, 11:55    [16976429]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
countnoncount
iap,

вы просто отвечаете на какой-то свой вопрос, не мой.
Код у меня выдает один и тот же результат.
Есть ли какое-нибудь отличие в коде в плане быстродействия\предпочтительности запроса. Если есть то почему.

план одинаков = быстродействие тоже
10 дек 14, 11:58    [16976452]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
countnoncount
Есть ли какое-нибудь отличие в коде в плане быстродействия\предпочтительности запроса. Если есть то почему.
Тебе ж русским по белому пишут - эти два варианта реализуют разную логику. Они подсчитывают разные вещи. То, что в твоём частном случае они равны - случайность.

Если же тебе пофиг что получить, лишь бы число, а число чего именно - неважно, то можешь спрашивать дальше...
10 дек 14, 12:00    [16976472]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
iap
Можно сказать иначе: все агрегатные функции игнорируют строки, для которых аргумент IS NULL.
За исключением COUNT(*)

И за исключением count(литерал)
10 дек 14, 12:05    [16976506]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
guest123456
Guest
Akina,
Выражения count(-1), count(0), count(1), count(''), count(ЛЮБАЯКОНСТАНТА) и count(*) это абсолютно одно и то же.
Просто принято использовать count(*) во избежание вопросов подобных данному топику.
10 дек 14, 12:06    [16976516]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
countnoncount
Guest
Нашел ответ на свой вопрос:
Myths and facts
As I said earlier, many people believe COUNT(columnname) is faster than using COUNT(*), because COUNT(*) would have to read all columns of each row (just like executing a SELECT * FROM MYTABLE statement), while COUNT(columnname) only need to read the specified column. This is not true though, for several reasons.


First of all, SQL Server can't read just the contents of a single column without reading the entire row. SQL Server stores the rows with the data on 8 KB data pages on disk. These pages contain one or more rows (depending on the size of each individual row, which may be up to 8060 bytes, with some exceptions), and these pages are placed in the internal memory (RAM) when SQL Server needs to access them for any reason. To check the value of a single column (or several of course), an entire page has to be read from disk and placed in memory. The pages may of course already be cached in memory, in which case the read will be much faster, but SQL still needs to read an entire page from memory just to check a single column of a row.

http://www.sqlservercentral.com/articles/Performance Tuning/adviceoncount/808/
10 дек 14, 12:10    [16976546]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
guest123456
Akina,
Выражения count(-1), count(0), count(1), count(''), count(ЛЮБАЯКОНСТАНТА) и count(*) это абсолютно одно и то же.
Просто принято использовать count(*) во избежание вопросов подобных данному топику.
Кроме * это - разные варианты выражения (expression).
А литералом может быть и NULL. SELECT COUNT(0*NULL) FROM [TableName] что вернёт?
10 дек 14, 12:12    [16976560]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
guest123456
Guest
iap,
Я говорил про константы, а 0*NULL это всёж-таки выражение.
А литерал count(null) интерпретатор не пропустит.
10 дек 14, 12:33    [16976683]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
countnoncount
Guest
countnoncount
Есть ли какая-нибудь разница в коде:

select count(*) from a

--и 

select count(1) from a

--или как вариант

select sum(1) from a



Отвечу вас на свой вопрос.
На больших таблицах более 8 млн записей время CPU несильно, но отличается:

автор
SQL Server Execution Times:
CPU time = 1173 ms, elapsed time = 309 ms.

SQL Server Execution Times:
CPU time = 1187 ms, elapsed time = 295 ms.

SQL Server Execution Times:
CPU time = 1813 ms, elapsed time = 459 ms.


Версия:

автор
Microsoft SQL Server 2012 (SP1) - 11.0.3153.0 (X64)
Jul 22 2014 15:26:36
10 дек 14, 12:39    [16976721]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
guest123456
iap,
Я говорил про константы, а 0*NULL это всёж-таки выражение.
А литерал count(null) интерпретатор не пропустит.
Банально, конечно, но константа - это тоже выражение.
В COUNT(*) звёздочка - это не список полей, о чём и говорится в цитате, которую достал countnoncount.
А всего лишь часть написания специфической функции.
Да и какой смысл был бы в списке всех полей таблицы в аргументе COUNT(*)?
10 дек 14, 12:43    [16976744]     Ответить | Цитировать Сообщить модератору
 Re: Count(*) vs Count(1), exists(select * from a) vs exists(select 1 from a)  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
countnoncount
countnoncount
Есть ли какая-нибудь разница в коде:

select count(*) from a

--и 

select count(1) from a

--или как вариант

select sum(1) from a




Отвечу вас на свой вопрос.
На больших таблицах более 8 млн записей время CPU несильно, но отличается:

автор
SQL Server Execution Times:
CPU time = 1173 ms, elapsed time = 309 ms.

SQL Server Execution Times:
CPU time = 1187 ms, elapsed time = 295 ms.

SQL Server Execution Times:
CPU time = 1813 ms, elapsed time = 459 ms.


Версия:

автор
Microsoft SQL Server 2012 (SP1) - 11.0.3153.0 (X64)
Jul 22 2014 15:26:36
А почему вызов разных функций должен был бы приводить к одинаковому времени выполнения?
С самого начала сказал Вам, что эти функции - разные.
10 дек 14, 12:45    [16976751]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить