Я использую, в спящем режиме для получения количества строк для определенного запроса. Скажем, у меня есть таблица под названием 'Человек' с различными столбцами. Один из тех столбцов является 'именем'.
Если бы я хотел получить число людей с именем '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 в моем списке
Не извлекайте результирующий набор, если вы просто хотите подсчитать количество строк, это просто означает бесполезные накладные расходы:
Person
или просто String
) даром. Другими словами, если вы хотите только посчитать, не делайте этого на стороне Java, СУБД оптимизированы для этой задачи и будут выполнять гораздо лучшую работу.
Это исключает (1) и (2).
Что касается (3) и (4), обратите внимание, что существует разница между count (*)
и count (col)
в целом:
count (*)
counts ALL rows count (col)
подсчитывает строки с ненулевым значениями col
, поэтому они будут давать разные результаты в производительность и результат запроса, если col
может иметь значение NULL ( count (*)
быстрее), в противном случае производительность идентична.
Я бы использовал (3).
Метод count (*)
оказался значительно быстрее, чем метод size ()
для моей компании. Это, безусловно, более эффективно с точки зрения памяти, поскольку вы не извлекаете данные столбца, которые вы не будете использовать. Я не знаю, имеет ли значение count (name)
.
Чем меньше вы поместите в функцию COUNT ()
, тем лучше. Если вам не нужна информация из таблицы, я бы сказал, используйте COUNT (1)
. Вы можете использовать COUNT (имя)
или COUNT (*)
, если ваши таблицы правильно проиндексированы.