Самый эффективный способ подсчета строк в запросе - PullRequest
7 голосов
/ 29 июля 2010

Я использую Hibernate для получения количества строк для конкретного запроса. Допустим, у меня есть таблица «Персона» с различными столбцами. Один из этих столбцов - «имя».

Если бы я хотел узнать количество людей с именем «Эндрю», какой из этих способов был бы наиболее эффективным? Предполагая, что есть разница в производительности между некоторыми / всеми из них. Есть ли лучший способ сделать это с помощью Hibernate / SQL?

(1) Выбрать все столбцы

Query query = session.createQuery("from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();

(2) Выберите только имя столбца

Query query = session.createQuery("select name from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();

(3) Использование Count в запросе

Query query = session.createQuery("select count(*) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();

(4) Использование счетчика со столбцом имени в запросе

Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();

Редактировать: Извините, у меня в списке было два номера 3

Ответы [ 3 ]

14 голосов
/ 29 июля 2010

Не извлекайте набор результатов, если вы просто хотите посчитать количество строк, это просто означает бесполезные накладные расходы:

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

Другими словами, если вы хотите только считать, не делайте этого на стороне Java, СУБД оптимизированы для этой задачи и сделают намного лучшую работу.

Это исключает (1) и (2).

Что касается (3) и (4), обратите внимание, что существует разница между count(*) и count(col) в целом:

  • count(*) считает ВСЕ строки
  • count(col) считает строки с ненулевыми значениями col

Таким образом, они будут давать разные результаты по производительности и результату запроса, если col может быть NULL (count(*) быстрее), в остальном идентичная производительность.

Я бы использовал (3).

Подобные вопросы

0 голосов
/ 29 июля 2010

Чем меньше вы вкладываете в функцию COUNT(), тем лучше. Если вам не нужна какая-либо информация из таблицы, я бы сказал, используйте COUNT(1). Вы можете использовать COUNT(name) или COUNT(*), если ваши таблицы правильно проиндексированы.

0 голосов
/ 29 июля 2010

Метод count(*) оказался значительно быстрее, чем метод size() для моей компании. Это, безусловно, более эффективно использует память, так как вы не просматриваете данные столбца, которые вы не будете использовать. Я не знаю, если count(name) имеет значение.

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