Самый эффективный способ считать строки запроса

Я использую, в спящем режиме для получения количества строк для определенного запроса. Скажем, у меня есть таблица под названием 'Человек' с различными столбцами. Один из тех столбцов является 'именем'.

Если бы я хотел получить число людей с именем 'Andrew', который из этих путей был бы самым эффективным? Принятие там является различием в производительности между некоторыми/всеми ими. Существует ли лучший способ сделать, это использование В спящем режиме/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) Используя количество в запросе

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 в моем списке

8
задан digiarnie 29 July 2010 в 01:36
поделиться

3 ответа

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

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

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

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

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

  • count (*) counts ALL rows
  • count (col) подсчитывает строки с ненулевым значениями col

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

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

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

14
ответ дан 5 December 2019 в 12:07
поделиться

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

0
ответ дан 5 December 2019 в 12:07
поделиться

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

0
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: