SQL-запрос: какой я должен использовать? count ("имя столбца") или count (1) - PullRequest
4 голосов
/ 05 января 2010

В моем запросе SQL мне просто нужно проверить, существуют ли данные для определенного идентификатора пользователя.

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

У меня есть два варианта

1. select count(columnname) from table where userid=:userid

2. select count(1) from tablename where userid=:userid

Я думаю, что второй - тот, который я должен использовать, потому что он может иметь лучшее время отклика по сравнению с первым.

Ответы [ 6 ]

2 голосов
/ 05 января 2010

Я хотел бы отметить, что это:

select count(*) from tablename where userid=:userid

имеет тот же эффект, что и ваше второе решение, с тем преимуществом, что count(*) однозначно означает «считать все строки».

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

Недостаток написания COUNT(1) в том, что он менее понятен: что вы имели в виду? Буквенный (1) может выглядеть как строчная буква L (это: l) в некоторых шрифтах.

2 голосов
/ 05 января 2010

Могут быть различия между count(*) и count(column). count(*) часто является самым быстрым по причинам, обсуждаемым здесь . В основном, с count(column) база данных должна проверять, является ли column нулевым или нет в каждой строке. С count(column) он просто возвращает общее количество строк в таблице, которое, вероятно, имеется под рукой. Точные данные могут зависеть от базы данных и версии базы данных.

Краткий ответ: используйте count(*) или count(1). Черт возьми, забудь счет и select userid.

Вы также должны убедиться, что предложение where работает хорошо и использует индекс. Посмотрите на EXPLAIN.

1 голос
/ 05 января 2010

Для подсчета количества записей следует использовать второй вариант, а точнее:

select count(*) from tablename where userid=:userid

Вы также можете использовать функцию существующие ():

select case when exists(select * from tablename where userid=:userid) then 1 else 0 end

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

1 голос
/ 05 января 2010

Это зависит от того, что вы хотите сделать.

Первая подсчитывает строки с ненулевыми значениями columnname. Второй подсчитывает ВСЕ строки.

Какое поведение вы хотите? Судя по тому, как сформулирован твой вопрос, я думаю, что тебе нужен второй.

1 голос
/ 05 января 2010

Дадут разные результаты, если имя столбца может быть NULL, в противном случае идентичная производительность.

Оптимизатор (по крайней мере, SQL Server) понимает, что COUNT(1) тривиально. Вы также можете использовать COUNT(1/0)

0 голосов
/ 05 января 2010

Эй, как насчет Выбрать количество (идентификатор пользователя) из таблицы, где идентификатор пользователя =: идентификатор пользователя? Таким образом, запрос выглядит более дружественным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...