为什么count(1),count(列)和count(*)具有相同的成本?

Tam*_*ang 2 sql sql-server

为什么三个查询的成本相同?我想至少有一个应该更快.否则,只使用关键字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)

Gor*_*off 5

严格来说,他们没有相同的成本. count(1)并count(*)应优化为同一件事. count(<column>)需要比较列值,从而NULL产生轻微的开销.

它们基本相同的原因是双重的.首先,运行查询的过程包括两个阶段:编译/优化和执行.SQL编译器/优化器足够聪明,可以知道count(1)并且count(*)是相同的(至少对于大多数数据库而言).

第二个原因是因为查询的时间通常由从表中提取记录的I/O时间决定 - 特别是对于简单查询.因此,NULL与执行引擎必须执行的其他操作相比,比较列值的开销可以忽略不计.