Java 计算查询行数的最有效方法
我正在使用Hibernate检索特定查询的行数。假设我有一个名为“Person”的表,它有不同的列。其中一列是“name” 如果我想知道“安德鲁”的人数,以下哪种方法最有效?假设部分/全部之间存在性能差异。使用Hibernate/SQL有更好的方法吗 (1) 选择所有列Java 计算查询行数的最有效方法,java,sql,hibernate,Java,Sql,Hibernate,我正在使用Hibernate检索特定查询的行数。假设我有一个名为“Person”的表,它有不同的列。其中一列是“name” 如果我想知道“安德鲁”的人数,以下哪种方法最有效?假设部分/全部之间存在性能差异。使用Hibernate/SQL有更好的方法吗 (1) 选择所有列 Query query = session.createQuery("from Person where name= :name"); query.setParameter("name", name); List result
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();
Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
(4) 将Count与查询中的name列一起使用
Query query = session.createQuery("select count(*) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
编辑:很抱歉,我的列表中有两个3号对于我的公司来说,
count(*)
方法比size()
方法要快得多。它当然更节省内存,因为您不需要跨越不使用的列数据。我不知道count(name)
是否起作用。在count()函数中放的越少越好。如果您不需要表中的任何信息,我建议使用COUNT(1)
。只要表的索引正确,就可以使用COUNT(name)
或COUNT(*)
。如果只想计算行数,不要检索结果集,这只意味着无用的开销:
- 您将获得比实际需要更多的内容(无论您选择的是所有列还是一列)
- 你需要把它们通过电线发送出去
- 您需要免费创建实例(无论是完整的
个人
实体还是仅仅是字符串
)
换句话说,如果您只想计算,不要在Java端进行计算,DBMS针对这项任务进行了优化,将做得更好
这不包括(1)和(2)
关于(3)和(4),请注意,count(*)
和count(col)
之间通常存在差异:
count(*)
counts所有行
count(col)
对col
因此,如果col
可以为NULL(计数(*)
更快),则它们将给出不同的性能结果和查询结果,否则性能相同
我会用(3)
类似问题
COUNT(*)
中的*
不会扩展到所有列,并且COUNT(1)
相当于COUNT(*)
。我同意,PostgreSQL PL/SQL中除外。至少我使用的PostgreSQL的最后一个版本有所不同。在Oracle、MS SQL Server和MySQL中,这两者绝对是等价的。我想这只是我的一个坏习惯。如果您使用COUNT()查看是否存在任何记录,那么对于MS SQL,EXISTS()函数比COUNT()更有效。如果有人想知道,COUNT(*)与COUNT(name)确实有很大区别: