我经常发现这三种变体:
SELECT COUNT(*) FROM Foo;
SELECT COUNT(1) FROM Foo;
SELECT COUNT(PrimaryKey) FROM Foo;据我所知,它们都做同样的事情,我发现我自己在我的代码库中使用这三个。然而,我不喜欢用不同的方式做同样的事情。我应该坚持哪一个?他们中有哪一个比其他两个更好?
发布于 2010-04-26 09:15:08
至少在甲骨文上,它们都是一样的:http://www.oracledba.co.uk/tips/count_speed.htm
发布于 2010-04-26 11:45:37
我感觉不同的DBMS的性能特征是不同的。这一切都取决于他们选择如何实现它。由于我在Oracle上做过大量的工作,所以我将从这个角度来讲述。
COUNT(*) -在传递给count函数之前,将整个行提取到结果集中,如果该行不为null,则count函数将聚合1
COUNT(1) -不会提取任何行,而是在WHERE匹配时,使用常量值1为表中的每行调用count。
COUNT(PK) -已索引Oracle中的主键。这意味着Oracle必须只读索引。通常,索引B+树中的一行比实际行小很多倍。因此,考虑到磁盘IOPS速率,与整行相比,Oracle可以通过一次块传输从索引中提取数倍多的行。这会导致更高的查询吞吐量。
在Oracle中,您可以看到第一个计数是最慢的,而最后一个计数是最快的。
https://stackoverflow.com/questions/2710621
复制相似问题