在Oracle中,当查询行存在时,为什么Select 1快于Select count(*)?
答案 0 :(得分:15)
最好还是使用RDBMS支持的EXISTS或等效的EXISTS,因为这会在找到匹配后立即停止处理行。
答案 1 :(得分:14)
由于Oracle不支持PL / SQL中的IF EXISTS,因此CodeByMidnight建议使用EXISTS通常会使用类似
的内容。SELECT 1
INTO l_local_variable
FROM dual
WHERE EXISTS(
SELECT 1
FROM some_table
WHERE some_column = some_condition );
Oracle知道一旦找到一行就可以停止处理WHERE EXISTS子句,因此它不必计算符合条件的大量行。当然,如果要检查是否存在具有特定键的行,而不是检查涉及未编制索引的列的条件或检查可能导致返回大量行的条件,则这不是一个问题。
(注意:我希望我可以将其作为对CodeByMidnight帖子的评论发布,但评论不能包含格式化代码)。
更新:鉴于原始海报在评论中做出的澄清,简短而明确的答案是SELECT 1
或SELECT COUNT(1)
并不比SELECT COUNT(*)
快。与您正在查看的编码指南相反,COUNT(*)
是计算所有行的首选方法。有一个古老的神话,COUNT(1)
更快。至少在过去十年中发布的任何Oracle版本中都不是这样,并且它不太可能是真的。然而,这是一种广泛持有的信念。今天,执行COUNT(1)
而不是COUNT(*)
的代码通常会让我怀疑作者是否容易相信各种Oracle神话,这就是我建议使用COUNT(*)
的原因。
答案 2 :(得分:2)
如果没有正确优化select count(*),我会很惊讶,不需要加载所有列,因为没有与列相关的处理。
答案 3 :(得分:1)
答案 4 :(得分:0)
因为星号将所有cols都计入计数,“1”是本机数据类型。
在MySQL中,“SELECT COUNT(name_of_the_primary_key)”应该与SELECT 1一样快。 它的重要指数。索引上的count()应该非常快;)
答案 5 :(得分:0)
我不认为甲骨文是这样的。 http://justoracle.blogspot.com/2006/12/count-vs-count1.html
但是,在某些数据库中,原因是'*'必须访问表元数据。这往往会增加不必要的开销。 1只是一个文字。
答案 6 :(得分:0)
在所有其他条件相同的情况下,"select 1 from my_table"
会比"select count(*) from my_table"
更快地返回第一个结果,但如果您从查询中检索所有结果,{{1}一个会更快,因为它涉及更少的数据(1个整数,而不是表中每行1个整数)。
答案 7 :(得分:0)
如果您使用的是 postgresql,那么 count(1)
实际上比 count(*)
慢
每个:https://www.citusdata.com/blog/2016/10/12/count-performance/:
<块引用>关于 count(1)
与 count(*)
的说明。人们可能会认为 count(1)
会更快,因为 count(*)
似乎会查询整行的数据。然而事实恰恰相反。星号在这里没有意义,这与它在 SELECT *
中的使用不同。 PostgreSQL 将表达式 count(*)
解析为不带参数的特殊情况。 (从历史上看,表达式应该被定义为 count()
。)另一方面,count(1)
接受一个参数,PostgreSQL 必须检查每一行以查看它的参数 1 确实仍然不是 NULL .