1 added
1 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: субд, базы данных, sql server, ms sql, count(1), count(*)</p>
1
<p>Теги: субд, базы данных, sql server, ms sql, count(1), count(*)</p>
2
<p>Многие наверняка знают про то, что если написать<strong>Count(*)</strong>по таблице, получите количество строк в таблице. Довольно часто я встречаю мнение, что лучше писать<strong>Count(1)</strong>, так как это будет использовать меньше ресурсов сервера, потому что вы указываете скалярное выражение вместо всех полей таблицы.</p>
2
<p>Многие наверняка знают про то, что если написать<strong>Count(*)</strong>по таблице, получите количество строк в таблице. Довольно часто я встречаю мнение, что лучше писать<strong>Count(1)</strong>, так как это будет использовать меньше ресурсов сервера, потому что вы указываете скалярное выражение вместо всех полей таблицы.</p>
3
<h2>Так что же использовать?</h2>
3
<h2>Так что же использовать?</h2>
4
SELECT COUNT(*) FROM Sales.CustomerTransactions; Или же SELECT COUNT(1) FROM Sales.CustomerTransactions;<p>Возможно, когда-то для некоторых СУБД это было правдой и Count(1) экономил ресурсы, но не для<strong>SQL Server</strong>- даже в далёкой версии 2005 оба выражения<strong>работали одинаково эффективно</strong>.</p>
4
SELECT COUNT(*) FROM Sales.CustomerTransactions; Или же SELECT COUNT(1) FROM Sales.CustomerTransactions;<p>Возможно, когда-то для некоторых СУБД это было правдой и Count(1) экономил ресурсы, но не для<strong>SQL Server</strong>- даже в далёкой версии 2005 оба выражения<strong>работали одинаково эффективно</strong>.</p>
5
<h3>Давайте в этом убедимся</h3>
5
<h3>Давайте в этом убедимся</h3>
6
<p>Выполним запрос и посмотрим на актуальный план:</p>
6
<p>Выполним запрос и посмотрим на актуальный план:</p>
7
<p>Видим, что план одинаковый и оптимизатор оценивает стоимость выполнения обоих запросов, как равную. Теперь посмотрим на часть по статистике ввода-вывода:</p>
7
<p>Видим, что план одинаковый и оптимизатор оценивает стоимость выполнения обоих запросов, как равную. Теперь посмотрим на часть по статистике ввода-вывода:</p>
8
<p>Количество сканирований и логических чтений для обоих запросов абсолютно идентично. Значит оба варианта равноценны по производительности для SQL Server. Обращаю внимание, что для других РСУБД результат может быть иной.</p>
8
<p>Количество сканирований и логических чтений для обоих запросов абсолютно идентично. Значит оба варианта равноценны по производительности для SQL Server. Обращаю внимание, что для других РСУБД результат может быть иной.</p>
9
-
<p>Миф о том, что Count(1) ме��ее ресурсоёмкий возник довольно давно и связан с тем, что символ звездочка * указывает на выборку всех полей, а значит, логически подумав, можно предположить, что считать строки, используя все поля таблицы, будет значительно дороже, чем посчитать, используя скалярное выражение - 1.</p>
9
+
<p>Миф о том, что Count(1) менее ресурсоёмкий возник довольно давно и связан с тем, что символ звездочка * указывает на выборку всех полей, а значит, логически подумав, можно предположить, что считать строки, используя все поля таблицы, будет значительно дороже, чем посчитать, используя скалярное выражение - 1.</p>
10
<p>Также есть ситуации, когда пишут Count(FieldName). В этом случае всегда нужно помнить, что если поле<strong>FieldName</strong>может содержать<strong>NULL</strong>, то<strong>Count</strong>проигнорирует такие строки, а значит и результат Count(*) и Count(FieldName) может быть разный.</p>
10
<p>Также есть ситуации, когда пишут Count(FieldName). В этом случае всегда нужно помнить, что если поле<strong>FieldName</strong>может содержать<strong>NULL</strong>, то<strong>Count</strong>проигнорирует такие строки, а значит и результат Count(*) и Count(FieldName) может быть разный.</p>
11
<p><em>А вы используете в своем проекте Count(1)? Пишите в комментариях!</em></p>
11
<p><em>А вы используете в своем проекте Count(1)? Пишите в комментариях!</em></p>
12
12