是计数(索引列)比计数(*)快吗?

时间:2010-07-01 15:47:46

标签: sql sql-server

  

可能重复:
  Performance of COUNT SQL function

大家好, 我有非常大的表,我需要知道每个表中的记录数量,我的问题是如果我运行它会减少运行时间:

select count(indexed column like my PK) from tbTest

而不是

select count(*) from tbTest

5 个答案:

答案 0 :(得分:6)

请参阅Performance of COUNT SQL function

重要的是要注意它们不等同

答案 1 :(得分:1)

由于问题在于是否存在性能差异,因此取决于索引。当你执行COUNT(*)时,它将使用PK列来确定行数。如果除了PK列上的聚簇索引之外没有任何索引,它将扫描聚簇索引上的叶节点。这可能是很多页面。如果您的非聚簇索引比聚簇索引更精细,那么它将选择相应的索引,从而减少读取次数。

因此,如果您选择的列包含在表中最小的非聚集索引中,则SQL查询优化器将为这两个计数选择()(如果您有一个群集的ix即PK )和count(indexed_column)。如果选择仅包含在宽索引中的计数(indexed_col),那么如果PK是聚簇索引,则计数()将更快。这样做的原因是在所有非聚集索引中都有一个指向聚簇索引的指针,SQL Server可以根据该非聚簇索引计算出行数。

因此,像在SQL Server中一样,它取决于。做一个showplan并将查询相互比较。

答案 2 :(得分:1)

SELECT COUNT(*) 可能更快。这是因为使用*可以让优化器自由选择任何列来依赖。假设您在INT列上有主键,在不同的bigint列上有非群集键。但主键可能是聚簇索引,因此它实际上比非聚​​簇bigint索引(具有更多页面)大得多。因此,如果优化器可以自由选择bigint非聚集索引,它可以更快地返回响应。可能更快,具体取决于表格。

因此总是最好将其保留为COUNT(*)并让优化程序选择。

答案 3 :(得分:0)

最有可能的情况是,如果查询扫描索引而不是整个表。

测试是一件容易的事,成为你自己的科学家。

答案 4 :(得分:-1)

两者都是相同的。如果你查看两者的查询执行计划,两者都将进行“索引扫描”