2012-03-07 51 views
5

據我所知,每個事務都會看到自己的數據庫版本,因此係統無法從某個計數器獲取總行數,因此需要掃描索引。但我認爲這將是主鍵上的聚集索引,而不是附加索引。如果我有超過一個額外的索引,哪一個將被選擇,無論如何?爲什麼在計算表中的所有行時會出現非聚簇索引掃描?

在深入研究此事時,我發現了另一件奇怪的事情。假設有兩個相同的表格,Articles和Articles2,每個都有三列:Id,View_Count和Title。第一個只有一個聚集的基於PK的索引,而第二個在view_count上有一個額外的非聚集非唯一索引。對於具有附加索引的表,查詢SELECT COUNT(1) FROM Articles運行速度快2倍。

回答

8

SQL Server將優化您的查詢 - 如果需要對錶中的行進行計數,它將選擇儘可能最小的一組數據來執行此操作。

所以,如果你考慮你的聚集索引 - 它包含實際的數據頁面 - 可能每行數千字節。加載所有這些字節來計算行數將是浪費 - 即使只是在磁盤I/O方面。

因此,它有一個非聚集索引,沒有以任何方式進行過濾或限制,SQL Server將選擇該數據結構進行計數 - 因爲非聚集索引基本上包含已放入NC的列索引(加上聚簇索引鍵) - 要加載的數據要少得多,以便計算行數。

+0

是的,當我發佈第二部分並仔細查看計劃時,我想到了這一點。集羣索引掃描具有相同的CPU成本但IO成本較高。 – synapse 2012-03-07 06:14:58

相關問題