Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算查询行数的最有效方法_Java_Sql_Hibernate - Fatal编程技术网

Java 计算查询行数的最有效方法

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

我正在使用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();
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)

类似问题

您使用的是什么数据库和版本?现在我正在编写一些针对HSQLDB的实验代码。我想这是所有星展银行的一个普遍问题。尽管根据您的问题判断,答案可能会因数据库而异。
COUNT(*)
中的
*
不会扩展到所有列,并且
COUNT(1)
相当于
COUNT(*)
。我同意,PostgreSQL PL/SQL中除外。至少我使用的PostgreSQL的最后一个版本有所不同。在Oracle、MS SQL Server和MySQL中,这两者绝对是等价的。我想这只是我的一个坏习惯。如果您使用COUNT()查看是否存在任何记录,那么对于MS SQL,EXISTS()函数比COUNT()更有效。如果有人想知道,COUNT(*)与COUNT(name)确实有很大区别: