为什么选择1比选择计数(*)更快?
-
05-07-2019 - |
题
在Oracle中,当查询行存在时,为什么Select 1快于Select count(*)?
解决方案
由于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(*)
。
其他提示
最好还是使用RDBMS支持的EXISTS或等效的EXISTS,因为这会在找到匹配后立即停止处理行。
如果没有正确优化select count(*),我会很惊讶,不需要加载所有列,因为没有与列相关的处理。
因为一颗星将所有cols带入计数,所以“1”是本机数据类型。
在MySQL中“SELECT COUNT(name_of_the_primary_key)”应该和SELECT 1一样快。 它的重要指数。索引上的count()应该非常快;)
我不认为甲骨文是这样的。 http://justoracle.blogspot.com/2006/12/count- VS-count1.html
但是,在某些数据库中,原因是'*'必须访问表元数据。这往往会增加不必要的开销。 1只是一个文字。
在所有其他条件相同的情况下," my_table"
中的选择1将比更快地返回第一个结果,并从my_table"中选择count(*)
,但是如果从查询中检索所有结果,那么 count(*)
会更快,因为它涉及更少的数据(1个整数,而不是每行1个整数)在表中。)