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

时间:2014-08-04 02:27:16

标签: sql sql-server

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

1 个答案:

答案 0 :(得分:5)

严格来说,他们没有相同的成本。 count(1)count(*)应该优化为同一个东西。 count(<column>)需要将列值与NULL进行比较,从而产生轻微的开销。

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

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