2010-07-01 29 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(*)並讓優化器選擇。