大家好,我 已经非常大的表,我需要知道在每个记录数,我的问题是它降低了运行时间如果我运行:
select count(indexed column like my PK) from tbTest
,而不是
select count(*) from tbTest
大家好,我 已经非常大的表,我需要知道在每个记录数,我的问题是它降低了运行时间如果我运行:
select count(indexed column like my PK) from tbTest
,而不是
select count(*) from tbTest
很可能,如果查询扫描索引而不是整个表。
这是一件容易的事情来测试,成为你自己的科学家。
看到Performance of COUNT SQL function
重要的是要注意的是,他们是不等价的
两者是相同的。如果您查看两者的查询执行计划,两者都将执行“索引扫描”
由于COUNT(*)将使用PK索引,所以它们只有在所选列是PK时才是相同的。 – 2010-07-01 15:57:15
是的!这个问题涉及到索引的Pk列!所以他们必须是相同的! :)换句话说, – Baaju 2010-07-01 15:58:21
由于问题在于是否存在性能差异,它将取决于索引。当您执行COUNT(*)时,它将使用PK列确定行数。如果除PK列上的聚簇索引之外没有任何索引,它将扫描聚簇索引上的叶节点。这可能是很多页面。如果您有一个非聚簇索引比聚簇索引小,它将选择它,导致读取更少。因此,如果您选择的列包含在表上最小可能的非聚簇索引中,则SQL查询优化程序将为这两个计数()(如果您拥有聚簇的ix即PK)并计数(indexed_column)。如果您选择仅包含在宽索引中的计数(indexed_col),则如果您的PK是聚簇索引,则计数()会更快。这样做的原因是在所有非聚集索引中都有一个指向聚簇索引的指针,SQL Server可以根据该非聚簇索引计算出行数。
因此,像往常一样在SQL Server中,这取决于。做一个showplan并将查询相互比较。
。你所做的最好的做法是用'count(从索引中得到的索引不是空列)获得相同的速度并且可能更糟糕。 (除非统计信息大量失控)。如果添加了更好的索引,则使用count(*)查询优化器可以更改其计划。 – 2010-07-01 16:41:48
SELECT COUNT(*)
可能会更快。这是因为使用*
可让优化者自由选择任何列来指望。假设你在INT列上有一个主键,在另一个bigint列上有一个非集群键。但主键可能是集群索引,因此它实际上比非集群bigint索引(包含更多页面)大得多。所以如果优化器可以自由选择bigint非聚集索引,它可以更快地返回响应。可能太多更快,这取决于表格。
因此总体上总是更好,将其保留为COUNT(*)
并让优化器选择。
说实话我没有发现这个问题,但我认为我的问题略有不同,因为它是关于索引列的:D谢谢 – Asha 2010-07-01 16:04:46