В моем приложении RoR у меня есть запрос, который может возвращать от 0 до 1000000 результатов, что я ограничиваю 16 и предоставляет разбиение на страницы для:
find(:all, :conditions => conditions, :limit => limit, :offset => offset)
Я хотел бы сообщить пользователю, сколько результатов они ищут, и общее количество результатов. Что-то вроде "Показаны 16 из 500". Каков наилучший способ получить общее количество строк без выполнения незавершенного запроса, который, несомненно, будет медленным в случае большого набора результатов? Я также хотел бы остаться агностиком базы данных.
Казалось бы, я должен был использовать google немного более тщательно. Rails имеет встроенный класс ActiveRecord:: Calculations (go figure), чтобы сделать прагматичный подсчет базы данных. Я закончил использование кода следующим образом:
results = find(:all, :conditions => conditions, :limit => limit, :offset => offset)
total_count = count(:conditions => conditions)
return {:results => results, :total_count => total_count}
В базе данных нет способа узнать количество строк, соответствующих запросу, если оно фактически не выполняет все это. Например, если вы выбираете для MYCOLUMN > 5, тогда ему нужно прочитать MYCOLUMN в каждой строке таблицы, чтобы узнать, сколько из них имеют значения больше 5. (Хотя вы могли бы повысить эффективность с помощью индекса.)
Обычно для целей, которые вы описали, используется COUNT (*).
Единственный другой способ, с помощью которого можно получить количество строк, которые будут возвращены для запроса без большой работы, - это добавить триггерную функцию в таблицу, которая обновляет счетчик каждый раз, когда строка вставлена, обновлена или удаляется в зависимости от того, соответствует ли он запросу. Тем не менее, это жестко, поскольку оно должно быть настроено для индивидуальных запросов, и это, безусловно, не является агностическим подходом к базе данных.
count
без:limit
чтобы получить количество всех возвращаемых строк. Перегрузка базы данных не вызывает проблем: они обычно могут очень быстро обрабатывать запросыCOUNT
. Просто убедитесь, что у столбцов условий есть индексы, и все будет работать нормально. Я действительно не рекомендую такие решения, как хранимые процедуры или функции запуска. База данных программы напрямую может быть настолько болезненной и приводить к таким большим головным болям, что для этого у вас должна быть реальная причина.