无数次听到“不要写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背后的实际执行逻辑。