最高效的计算查询行数的方法
最高效的计算查询行数的方法
我正在使用Hibernate来检索特定查询的行数。假设我有一个名为'Person'的表,其中包含各种列。其中一个列是'name'。
如果我想获取名为'Andrew'的人数,哪种方式最有效?假设其中一些/全部之间存在性能差异。是否有更好的使用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) 仅选择name列
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) 在查询中使用name列进行Count
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(name)
的区别是很大的:stackoverflow.com/questions/33480424/…
问题的原因是,对于查询中的行数计数,使用count(*)
方法比使用size()
方法更高效。这是因为count(*)
方法只计算行的数量,而不拉取具体的列数据,从而节省了内存和时间。此外,count(name)
方法与count(*)
方法也存在差异,并且count(*)
方法的性能更好。
解决方法是使用count(*)
方法来计算查询的行数。这样可以避免拉取不需要的列数据,提高内存和时间的效率。此外,在某些情况下,count(name)
方法和count(*)
方法的性能也存在差异,需要根据具体情况进行选择和测试。
对于查询的行数计数,使用count(*)
方法是最高效的方法。它不仅在内存和时间上更加高效,还避免了拉取不需要的列数据。在实际使用中,我们还需要根据具体情况选择合适的计数方法,以获得最佳的性能。
问题:在查询中计算行数的最高效方法是什么?
原因:在计算查询结果的行数时,使用COUNT()函数的内容越少越好。如果不需要从表中获取任何信息,建议使用COUNT(1)。可以使用COUNT(name)或COUNT(*),只要表的索引设置正确。
解决方法:在大多数数据库系统中,COUNT(*)和COUNT(1)是等效的。但是在PostgreSQL PL/SQL中,至少在我使用的最新版本中是有区别的。在Oracle、MS SQL Server和MySQL中,这两者是等效的。使用COUNT()函数来检查记录是否存在时,对于MS SQL来说,EXISTS()函数比COUNT()更高效。
文章如下:
查询中计算行数的最高效方法是什么?在计算查询结果的行数时,使用COUNT()函数的内容越少越好。如果不需要从表中获取任何信息,建议使用COUNT(1)。可以使用COUNT(name)或COUNT(*),只要表的索引设置正确。
在大多数数据库系统中,COUNT(*)和COUNT(1)是等效的。但是在PostgreSQL PL/SQL中,至少在我使用的最新版本中是有区别的。在Oracle、MS SQL Server和MySQL中,这两者是等效的。这可能仅仅是我的一个坏习惯。
如果你使用COUNT()函数来检查记录是否存在,对于MS SQL来说,EXISTS()函数比COUNT()更高效。
因此,在使用COUNT()函数计算查询结果的行数时,应尽量减少函数内部的内容,选择合适的COUNT()函数形式,并确保表的索引设置正确。对于需要检查记录是否存在的情况,使用EXISTS()函数可能更高效。
最有效地计算查询结果的行数的方法是什么?
在Java中,如果您只想计算行数,不要检索结果集,这只会产生无用的开销:
- 您将得到比实际需要的更多的内容(无论是选择所有列还是只选择一个列)
- 您需要将它们通过网络发送
- 您需要为这些结果创建实例(无论是完整的Person实体还是只是一个String)
换句话说,如果您只想计数,请不要在Java端进行计算,因为DBMS对此任务进行了优化,会执行得更好。这不包括(1)和(2)。
关于(3)和(4),请注意通常情况下count(*)
和count(col)
之间的区别:
- count(*)
计算所有行的数量
- count(col)
计算非空的col
值的行数
如果col
可以为NULL(count(*)
更快),则它们将在性能和查询结果上产生不同的结果,否则性能相同。我会使用(3)。
类似的问题:
- [COUNT(*) vs. COUNT(1) vs. COUNT(pk): which is better?](https://stackoverflow.com/questions/2710621)
- [count(*) vs count(column-name) - which is more correct?](https://stackoverflow.com/questions/3003457)
- [Count(*) vs Count(1)](https://stackoverflow.com/questions/1221559)
- [SQL Query: Which one should i use? count(“columnname”), count(1)](https://stackoverflow.com/questions/2004807)