2011-07-07 43 views
6

我有一個名爲Workflow的表。它有37M行。 ID列(int)上有一個主鍵加上一個額外的列。 ID列是索引中的第一列。爲什麼在查詢中沒有使用特定的索引?

如果我執行以下查詢,不使用PK(除非我使用索引提示)

Select Distinct(SubID) From Workflow Where ID >= @LastSeenWorkflowID 

如果我執行這個查詢相反,PK用於

Select Distinct(SubID) From Workflow Where ID >= 786400000 

我懷疑問題是在查詢中使用參數值(我必須這樣做)。我真的不想使用索引提示。有沒有解決方法?

+0

的SQL Server版本? –

+0

這是非聚集索引嗎?有聚集索引嗎? – JNK

+0

@JNK - SQL Server 2008和PK是一個聚集索引 –

回答

3

請張貼執行計劃以及確切的表格定義,包括所有索引。

當你使用一個變量時,優化器不知道查詢將具有什麼選擇性,@LastSeenWorkflowID可能會過濾掉工作流中除了最後幾行以外的所有行,或者它可能包含它們全部。生成的計劃必須在兩種情況下都能正常工作。有一個閾值,在聚集索引範圍尋找範圍變得比完全掃描非聚集索引更昂貴,這僅僅是因爲聚集索引更廣泛(它包括葉級別中的每一列),因此具有要迭代的頁面要多得多。生成的計劃(考慮@LastSeenWorkflowID的未知值)很可能在估計聚集索引查找的成本時超過該閾值,因此它會選擇掃描非聚集索引。

你可以提供在這個查詢專門針對狹窄指數:

CREATE INDEX WorkflowSubId ON Workflow(ID, SubId); 

或:

CREATE INDEX WorkflowSubId ON Workflow(ID) INCLUDE (SubId); 

這樣的指標是好得到通爲您的查詢,沒有重要@LastSeenWorkflowID的價值。

2

假設你的PK是一種身份或總是大於0,也許你可以試試這個:

Select Distinct(SubID) 
From Workflow 
Where ID >= @LastSeenWorkflowID 
    And ID > 0 

通過添加第二個條件,它可能會導致優化器使用索引查找。

相關問題