2010-07-01 15 views
5

可能重复:
Performance of COUNT SQL function是计数(索引列)比计数(*)快吗?

大家好,我 已经非常大的表,我需要知道在每个记录数,我的问题是它降低了运行时间如果我运行:

select count(indexed column like my PK) from tbTest 

,而不是

select count(*) from tbTest 
+0

说实话我没有发现这个问题,但我认为我的问题略有不同,因为它是关于索引列的:D谢谢 – Asha 2010-07-01 16:04:46

回答

0

很可能,如果查询扫描索引而不是整个表。

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

6

看到Performance of COUNT SQL function

重要的是要注意的是,他们是不等价的

+0

我以为这是之前问过的。;) – NotMe 2010-07-01 15:52:29

+0

链接中的这个问题涉及到some_column_name,但是这个问题是针对count(indexed_column)...所以它会是相同的 – Baaju 2010-07-01 15:57:03

+1

@Baaju,除了PK之外还有索引列。 – 2010-07-01 16:09:16

-1

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

+0

由于COUNT(*)将使用PK索引,所以它们只有在所选列是PK时才是相同的。 – 2010-07-01 15:57:15

+0

是的!这个问题涉及到索引的Pk列!所以他们必须是相同的! :)换句话说, – Baaju 2010-07-01 15:58:21

1

由于问题在于是否存在性能差异,它将取决于索引。当您执行COUNT(*)时,它将使用PK列确定行数。如果除PK列上的聚簇索引之外没有任何索引,它将扫描聚簇索引上的叶节点。这可能是很多页面。如果您有一个非聚簇索引比聚簇索引小,它将选择它,导致读取更少。因此,如果您选择的列包含在表上最小可能的非聚簇索引中,则SQL查询优化程序将为这两个计数()(如果您拥有聚簇的ix即PK)并计数(indexed_column)。如果您选择仅包含在宽索引中的计数(indexed_col),则如果您的PK是聚簇索引,则计数()会更快。这样做的原因是在所有非聚集索引中都有一个指向聚簇索引的指针,SQL Server可以根据该非聚簇索引计算出行数。

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

+1

。你所做的最好的做法是用'count(从索引中得到的索引不是空列)获得相同的速度并且可能更糟糕。 (除非统计信息大量失控)。如果添加了更好的索引,则使用count(*)查询优化器可以更改其计划。 – 2010-07-01 16:41:48

0

SELECT COUNT(*)可能会更快。这是因为使用*可让优化者自由选择任何列来指望。假设你在INT列上有一个主键,在另一个bigint列上有一个非集群键。但主键可能是集群索引,因此它实际上比非集群bigint索引(包含更多页面)大得多。所以如果优化器可以自由选择bigint非聚集索引,它可以更快地返回响应。可能太多更快,这取决于表格。

因此总体上总是更好,将其保留为COUNT(*)并让优化器选择。