count(1) 与count(*)有性能差别么?

无数次听到“不要写count(*)要写count(1),count(*)跑得慢”这种错误说法。

为什么count(1)与count(*)性能相同呢?因为执行计划相同,性能相同。本篇以oracle 11g为例讲解


首先 Oracle不允许纯空行数据(即所有字段皆为null),所以count(1)与count(*)结果必然相同,首先在无索引情况下 count(1) count(*) count(object_id) 的执行计划全部一样全表扫描:


有索引情况再看,count(1) count(*) count(object_id) 一样,快速全扫描

Create Index IND_test_a On a (object_id,0)  --为什么建object,0组合索引 因为oracle索引不存null,所以加上0保证所有行都在索引中

如果将索引改为 Create Index IND_test_a On a (object_id)会怎么样呢?count(1)与count(*)无法走索引,因为索引并没有包含所有行,只能全表扫秒,而count(object)可以走索引快速全扫描。

SQL优化不能靠瞎猜,而是分析SQL背后的实际执行逻辑。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容