2012-04-05 28 views
1

我正在優化在我們的系統上非常頻繁地使用的查詢。 where子句類似於使用DateTime列創建非聚集索引作爲鍵

WHERE J.Visibility > 11 
and J.isactive='true' 
and J.isdeleted='false' 
AND (
     CutOffDate > '2012-04-05 00:00:00.000' 
     OR J.CreatedOn > '2011-10-08 00:00:00.000' 
    ) 
AND J.Country = 'India' 
AND J.City='Bangalore' 
AND (J.Type > 0 AND J.Type < 230) 
AND J.Category in (20) 

已經是NC指數(指數1)與市,類型,可見,IsActive,存在請將isDeleted。我使用上面的字段創建了一個新的NC索引,但在開始時也添加了CreatedOn,CutOffDate和Category。

因此,新索引(索引2)上的鍵是城市,類別,CreatedOn,CutOffDate,類型,可見性等。CreatedOn和CutOffDate都是以降序排列。但是,當我運行查詢時,實際的執行計劃仍然對索引1進行索引掃描,而不是索引2。鑑於日期時間條件,我會認爲Index2將是更好的選擇,並會導致索引搜索。但是那沒有發生。

在調查爲什麼會發生這種情況時,我碰到了this MS article,現在我想知道是否需要像本文中提到的那樣創建帶有日期時間的索引。當我在Google上搜索時,我沒有發現這種創建帶有日期時間的索引的技術,因此想知道其他人做了什麼?

回答

2

什麼是確切索引定義? (City, Category, CreatedOn, CutOffDate, Type, Visibility)上的索引不能用於您的查詢。事實上,考慮到你有一個標準在兩個字段上使用不等式比較(>),並且在它們之間有OR條件,沒有可能有助於比較的日期時間部分的索引。您鏈接的文章與您的問題完全無關。

對於我們提出一個好的索引,你必須準確地告訴我們表的定義,你使用的確切查詢和每列中的基數(不同值的數量)。

+0

那麼這就解釋了爲什麼Index1選擇的是Index2而我卻是在嗅探錯誤的線索。但是,刪除其中一個字段和OR條件有助於使用日期時間索引? where子句的條件根據用戶在應用中做出的選擇而有所不同。我真的不能在這裏提供所有的細節。然而,表中有超過250,000行,並且CreatedOn> Date導致大約40,000行,這就是爲什麼我想使用具有CreatedOn的索引。此外,http://stackoverflow.com/questions/10028225/which-where-condition-on-datetime-will-be-faster是我爲此所做的變化 – shashi 2012-04-05 22:14:55

+0

此外,(20,30,40)中的類別是否符合與OR條件的平等比較使用具有Category的索引? – shashi 2012-04-05 22:18:26

+0

單個列*上的不等式比較*可能受益於索引。但是,由於索引[引爆點](http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx),這是一條危險的道路。大多數時間序列類型的數據使用時間值(例如'CreatedOn')作爲聚簇索引的最左邊的鍵,因爲絕大多數查詢請求來自特定時間*間隔*的數據(即[範圍掃描]( http://msdn.microsoft.com/en-us/library/ms177426.aspx)) – 2012-04-05 22:54:10