为什么三个查询的成本相同?我想至少有一个应该更快。否则,只使用关键字COUNT()而不是COUNT(参数)就可以了。
例如,这是COUNT()的示例实现,它不依赖于参数:
while(!end of table){
while(!end of record){
read byte;
}
add 1 on a count register;
}
查询1:
select column, COUNT(1)
from table
group by column
查询2:
select column, COUNT(column)
from table
group by column
查询3:
select column, COUNT(*)
from table
group by column
答案 0 :(得分:5)
严格来说,他们没有相同的成本。 count(1)
和count(*)
应该优化为同一个东西。 count(<column>)
需要将列值与NULL
进行比较,从而产生轻微的开销。
它们基本相同的原因是双重的。首先,运行查询的过程包括两个阶段:编译/优化和执行。 SQL编译器/优化器足够聪明,知道count(1)
和count(*)
是相同的(至少对于大多数数据库而言)。
第二个原因是因为查询的时间通常由从表中提取记录的I / O时间决定 - 特别是对于简单查询。因此,与执行引擎必须执行的其他操作相比,将列值与NULL
进行比较的开销可以忽略不计。