计算查询行的最有效方法

时间:2010-07-29 01:30:37

标签: 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.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)将Count与查询中的name列一起使用

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

编辑:对不起,我的名单中有两个3号

3 个答案:

答案 0 :(得分:14)

如果您只想计算行数,请不要检索结果集,这只是无用的开销:

  • 你会获得比实际想要更多的东西(无论你是选择所有列还是只选择一个)
  • 你需要通过电汇发送
  • 您将需要创建实例(无论是完整的Person实体还是仅String)。

换句话说,如果您只想计算,请不要在Java端进行计数,DBMS针对此任务进行了优化,并且可以做得更好。

这不包括(1)和(2)。

关于(3)和(4),请注意count(*)count(col)之间存在差异:

  • count(*)计算所有
  • count(col)计算非空col
  • 的行数

因此,如果col可以为NULL(count(*)更快),它们将在性能和查询结果中给出不同的结果,否则性能相同。

我会用(3)。

类似问题

答案 1 :(得分:0)

count(*)方法的分析速度明显快于我公司的size()方法。它肯定更节省内存,因为您没有跨越您不会使用的列数据。我不知道count(name)是否有所作为。

答案 2 :(得分:0)

你放入COUNT()功能越少越好。如果您不需要表中的任何信息,我会说使用COUNT(1)。只要表格被正确编入索引,您就可以使用COUNT(name)COUNT(*)