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

SQL Best Practice: count (1) или count (*)

Возможный дубликат:
Count (*) vs Count (1)

Я вспоминаю анекдотически:

никогда не использовать count (*), когда count (1) будет делать

Недавно я передал этот совет другому разработчику, и мне было предложено доказать, что это правда. Мой аргумент был тем, о чем мне говорили, когда мне дали совет: база данных вернет только первый столбец, который затем будет подсчитан. Контраргумент заключался в том, что база данных ничего не будет оценивать в скобках.

От некоторых (ненаучных) тестов на небольших таблицах, конечно, нет разницы. В настоящее время у меня нет доступа к большим таблицам для экспериментов.

Мне дали этот совет, когда я использовал Sybase, а в таблицах было сотни миллионов строк. Теперь я работаю с Oracle и значительно меньше данных.

Итак, я думаю, что мои два вопроса:

  • Что быстрее, count (1) или count (*)?
  • Будет ли это отличаться у разных поставщиков баз данных?
4b9b3361

Ответ 1

Согласно другому аналогичному вопросу (Count (*) vs Count (1)), они совпадают.

В Oracle, в соответствии с Ask Tom, count (*) - это правильный способ подсчета количества строк, потому что оптимизатор меняет счет (1) считать (*). count (1) на самом деле означает подсчет строк с ненулевым 1 (все они не равны нулю, поэтому оптимизатор изменит его для вас).

Ответ 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)
  • Нет, обычно это всегда будет иметь немного лучшую производительность.

Это повлияло бы только на то, чтобы увеличить масштаб до значительного количества, но это хорошая практика.