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