2010-11-16 90 views
0

這裏是我的查詢指數+ SQL Server 2005中

Declare @StartDateTime datetime, @EndDateTime datetime 

Select @StartDateTime = '2010-11-15', @EndDateTime = '2010-11-16' 

Select PracticeCode, AccountNo, ProcCd, Modifier , ChargeDos, Paid as Amt, CreatedDate, 
    case When Paid > 0 then 'P' 
      When Paid = 0 and WrittenOff = DueAmt then 'A' 
      Else 'O' 
    End as Status 
    From Trn_Postings 
    Where CreatedDate >= @StartDateTime and CreatedDate <= @EndDateTime 
      --and ManualOverride in ('S','F','X','G','O') 
      and ManualOverride in ('N','U') 

編輯:創建日期是包含&時間記錄的創建

日期我有單獨的索引日期時間列在CreatedDate和ManualOverride上。但執行計劃顯示聚簇索引掃描。該表有近百萬條記錄,並且在不久的將來可以增長4到5倍。

最令人驚訝的部分是,如果我更改下面的where子句,它使用這兩個索引。我只是不知道爲什麼。

 Where CreatedDate >= @StartDateTime and CreatedDate <= @EndDateTime 
      and ManualOverride in ('S','F','X','G','O') 
      --and ManualOverride in ('N','U') 

如何使SQL中使用索引...

而且如果我使用一個不在條款不會被使用的索引。

+0

因爲它的立場,優化*不考慮*索引。它*可能是錯誤的*在不使用索引爲您的第一個案件,但很可能,它不是。你能爲這兩種情況發佈計劃嗎? – 2010-11-16 07:49:43

+1

使用索引並不總能讓您獲得更好的性能。一個簡單的情況是,強制編譯器使用索引的速度會比較慢,通過執行返回** all **行的select。 – 2010-11-16 07:54:19

+0

'通過ManualOverride'從Trn_Postings組中選擇ManualOverride,COUNT(*)。如果N和U代表此列中的大部分值,則表示索引對查詢不會有用,所以優化器不太可能使用它。 – 2010-11-16 08:02:27

回答

0

我建議創建了CreatedDate和ManualOverride一個綜合指數。當使用索引可以滿足這兩個條件時,這就是優化器似乎在做的事情。

但是一旦知道它必須使用聚集索引來滿足查詢的一部分,它會顯示它忽略了其他索引。它決定COST(使用CreatedDate索引+ CI查找+條件)> COST(掃描CI)。這是錯的,但有時會發生。可能會使用兩列上的索引(CreatedDate first)。或者你可以嘗試使用INDEX query hint強制它的手。它可能仍然會選擇忽略提示。

+0

看起來像我必須忍受它: - (...「使用索引」表提示僅在Sql Server 2008中可用...我們仍然使用Sql server 2005 ... – 2010-11-16 09:40:58

+0

@ The King - 根據2005年,你仍然可以提供INDEX提示 - 使用OPTION子句並指定表提示。http://msdn.microsoft.com/en-us/library/ms187373(v=SQL.90).aspx – 2010-11-16 10:37:18

0

鑑於對於找到的每一行匹配where子句,它將不得不返回到聚集索引以獲取數據,如果有大量數據被返回,那麼只需逐步遍歷它可能會更有效並拉出它需要的行。

+0

我的查詢返回10M記錄中的近10000條記錄,僅佔記錄總數的1%... – 2010-11-16 08:47:19

0

考慮更新的統計數據:

update statistics Trn_Postings with fullscan 
+0

我按照你的建議做了......沒有任何變化。 – 2010-11-16 08:47:55