Подтвердить что ты не робот

Является ли "SELECT COUNT (столбец)" быстрее/медленнее, чем "SELECT COUNT (*)"?

Я запускаю такой запрос в MSSQL2008:

select count(*)
from t1
inner join t2 on t1.id = t2.t1_id
inner join t3 on t1.id = t3.t1_id 

Предположим, что t1.id имеет ограничение NOT NULL. Поскольку они являются внутренними соединениями и t1.id никогда не может быть нулевым, использование count(t1.id) вместо count(*) должно привести к такому же конечному результату. Мой вопрос: будет ли производительность одинаковой?

Мне также интересно, могут ли объединения повлиять на это. Я понимаю, что добавление или удаление соединения повлияет как на производительность, так и на длину набора результатов. Предположим, что без изменения шаблона соединения вы устанавливаете count для таргетинга только на одну таблицу. Разве это имеет значение? Другими словами, существует ли разница между этими двумя запросами:

select count(*)    from t1 inner join t2 on t1.id = t2.t1_id 
select count(t1.*) from t1 inner join t2 on t1.id = t2.t1_id 

COUNT (id) и COUNT (*) в MySQL отвечает на этот вопрос для MySQL, но я не мог найти ответы на MS-SQL специально, и я не может найти ничего, что учитывает фактор join.

ПРИМЕЧАНИЕ.. Я пытался найти эту информацию как в Google, так и в SO, но было сложно понять, как записать мой поиск.

4b9b3361

Ответ 1

Я пробовал несколько SELECT COUNT(*) FROM MyTable vs. SELECT COUNT(SomeColumn) FROM MyTable с различными размерами таблиц и где SomeColumn один раз является столбцом ключа кластеризации, как только он находится в некластеризованном индексе, и после того, как он не имеет индекса в все.

Во всех случаях, при всех размерах таблиц (от 300 000 рядов до 170 миллионов строк), я никогда не вижу любую разницу с точки зрения скорости или плана выполнения - во всех случаях COUNT обрабатывается путем выполнения кластерного сканирования индекса → то есть сканирования всей таблицы в основном. Если есть некластеризованный индекс, то сканирование находится на этом индексе - даже при выполнении SELECT COUNT(*)!

Кажется, нет никакой разницы в скорости или приближении, как подсчитываются эти вещи, - чтобы подсчитать их все, SQL Server просто должен сканировать весь период таблицы.

Тесты были выполнены в SQL Server 2008 R2 Developer Edition

Ответ 2

select count(*) будет медленнее, поскольку он пытается извлечь все. Указание столбца (PK или любой другой индексированный столбец) ускорит работу, поскольку механизм запроса заранее знает, что он ищет. Он также будет использовать индекс, а не идти против таблицы.