2008-09-12 3 views

ответ

13

Сказать, что SELECT COUNT(*) vs COUNT(1) результатов в СУБД возвращаются " столбцы "- чистая койка. Это может был случай, очень давно, но любой уважающий себя оптимизатор выберет какой-то быстрый метод для подсчета строк в таблице - есть НЕТ разница в производительности между SELECT COUNT(*), COUNT(1), COUNT('this is a silly conversation')

Кроме того, SELECT(1) vs SELECT(*) НЕ будет имеют какую-либо разницу в использовании INDEX - большинство СУБД фактически будут оптимизировать SELECT(n) into SELECT(*). См ASK TOM: Oracle была оптимизация SELECT(n) into SELECT(*) для большей части десятилетия, если не больше: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1156151916789

проблема заключается в COUNT (цв) для подсчета () преобразования ** 03/23/00 05:46 pm *** одним из способов является установление события 10122 на выключение счета (col) -> count () оптимизация.Другая работа вокруг - , чтобы изменить счет (col), чтобы подсчитать (), это означает то же самое, когда col имеет ограничение NOT NULL. Номер ошибка является 1215372.

Одно замечание - если вы используете COUNT (Col) (! Нет) и Col помечается NULL, то это будет на самом деле нужно подсчитать количество вхождений в таблицу (либо путем сканирования по индексу, гистограммы и т. д., если они существуют, либо полного сканирования таблицы в противном случае).

Итог: если то, что вы хотите это количество строк в таблице, используйте COUNT (*)

5

Я считаю, это один был дан ответ на: In SQL, what's the difference between count(column) and count(*)?

+0

Это очень похоже (и может быть, это тот же ответ), но я задавался вопросом, существует ли разница между ссылкой на конкретный столбец (например, COUNT (столбец)) по сравнению с ссылкой на произвольную строку (например, COUNT ('x'),). – Andrew 2008-09-12 16:34:09

3

Основная разница в производительности является то, что COUNT (*) может быть выполнено путем проверки первичного ключа стол.

т. Е. В простом случае ниже запрос немедленно возвращается, без необходимости проверять любые строки.

select count(*) from table 

Я не уверен, если оптимизатор запросов в SQL Server будет делать это, но в приведенном выше примере, если столбец вы группирование на имеет индекс сервер должен быть в состоянии удовлетворить запрос, не задев фактическая таблица вообще.

Чтобы уточнить: этот ответ относится конкретно к SQL Server. Я не знаю, как справляются с этим другие продукты СУБД.

3

Этот вопрос немного отличается от другого, на который ссылаются другие. В заданном вопросе было задано вопрос, какая разница при использовании count (*) и count (SomeColumnName) и SQLMenace's answer.

Для решения этого вопроса, по существу, нет никакой разницы в результате. Оба count (*) и count ('x') и говорят, что count (1) вернет одинаковое число. Разница в том, что при использовании «*», как и в SELECT, все столбцы возвращаются, а затем подсчитываются. Когда используется константа (например, «x» или «1»), строка с одним столбцом возвращается и затем подсчитывается. Разница в производительности будет видна, когда «*» возвращает много столбцов.

Update: Приведенное выше утверждение о производительности, вероятно, не совсем правильно, как описано в других ответах, но не распространяется на подвыборки запросов при использовании EXISTS и NOT EXISTS

+0

Значит ли это, что COUNT ('x') будет быстрее, если в таблице было много столбцов, по сравнению с COUNT (*)? – Andrew 2008-09-12 16:07:44

+0

Я думаю, что это поведение зависит от базы данных и применяемой оптимизации запросов. Это очевидная оптимизация, когда вы видите COUNT (*). Это может означать только одно: вам нужно общее количество строк, независимо от того, сколько столбцов имеет таблица. – Brannon 2008-09-12 16:11:35

Смежные вопросы