SQL Best Practice: count (1) или count (*)
Возможный дубликат:
Count (*) vs Count (1)
Я вспоминаю анекдотически:
никогда не использовать count (*), когда count (1) будет делать
Недавно я передал этот совет другому разработчику, и мне было предложено доказать, что это правда. Мой аргумент был тем, о чем мне говорили, когда мне дали совет: база данных вернет только первый столбец, который затем будет подсчитан. Контраргумент заключался в том, что база данных ничего не будет оценивать в скобках.
От некоторых (ненаучных) тестов на небольших таблицах, конечно, нет разницы. В настоящее время у меня нет доступа к большим таблицам для экспериментов.
Мне дали этот совет, когда я использовал Sybase, а в таблицах было сотни миллионов строк. Теперь я работаю с Oracle и значительно меньше данных.
Итак, я думаю, что мои два вопроса:
- Что быстрее, count (1) или count (*)?
- Будет ли это отличаться у разных поставщиков баз данных?
Ответы
Ответ 1
Согласно другому аналогичному вопросу (Count (*) vs Count (1)), они совпадают.
В Oracle, в соответствии с Ask Tom, count (*) - это правильный способ подсчета количества строк, потому что оптимизатор меняет счет (1) считать (*). count (1) на самом деле означает подсчет строк с ненулевым 1 (все они не равны нулю, поэтому оптимизатор изменит его для вас).
Ответ 2
См.
Что лучше в подсчете MYSQL (*) или count (1)?
для MYSQL (нет разницы между count (*) и count (1))
Count (*) vs Count (1)
http://beyondrelational.com/blogs/dave_ballantyne/archive/2010/07/27/count-or-count-1.aspx
для MS Sql Server (без разницы)
http://dbaspot.com/sybase/349079-count-vs-count-1-a.html
для Sybase (без разницы)
Ответ 3
При чтении книг, посвященных TSQL и Microsoft SQL Server, я прочитал, что использование * лучше, потому что оно позволяет оптимизатору решить, что лучше всего делать. Я попытаюсь найти имена конкретных книг и разместить их здесь.
Ответ 4
Это такой базовый шаблон запроса, и значение идентично. Я читал не один раз, что оптимизатор относится к ним одинаково - не может найти конкретную ссылку прямо сейчас, но поместил это в категорию "институциональных знаний".
(нужно сначала выполнить поиск... http://stackoverflow.com/questions/1221559/count-vs-count1)
Ответ 5
Я могу говорить только с SQL Server, но тестирование на таблице 5 ГБ, 11-миллиметровые записи - оба числа чтения и план выполнения были идентичны.
Я бы сказал, что нет никакой разницы.
Ответ 6
Насколько я знаю, использование count() должно быть быстрее, потому что, когда эта функция называется, двигатель подсчитывает только индексы. С другой точки зрения, как count(), так и count (1) в двоичном коде выглядят очень похожими, поэтому не должно быть разницы.
Ответ 7
- счетчик (1)
- Нет, обычно это всегда будет иметь немного лучшую производительность.
Это повлияло бы только на то, чтобы увеличить масштаб до значительного количества, но это хорошая практика.