HTML Diff
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