2014-05-20 119 views
1

嗨在這裏,我有一個查詢,我需要改善此查詢的性能。任何人都可以建議我喜歡如何將聚簇索引掃描轉換爲索引查找。如何通過正確索引來提高查詢性能?

DECLARE @now DateTime;  
DECLARE @lastweekstart DateTime;  
DECLARE @lastweekend DateTime;  


SET @now = getDate();  
SET @lastweekstart = DATEADD(  
       DD,  
       -(DATEPART(DW, @now - 14) - 1),  
       @now - 14);  
SET @lastweekend = DATEADD(  
       DD,  
       7 - (DATEPART(DW, @now - 14)),  
       @now - 14);  



SELECT Distinct CHINFO.CHILDID, 
     COUNT(*) as PREVIOUSWEEKSACCIDENTS  
FROM BKA.CHILDINFORMATION CHINFO  
JOIN BKA.CHILDEVENTS CHE  
     ON CHE.CHILDID = CHINFO.CHILDID   
JOIN BKA.CHILDEVENTPROPERITIES CHEP  
     ON CHE.EVENTID = CHEP.EVENTID   
WHERE (CHE.TYPE = 'ACCIDENT' OR (CHE.TYPE = 'POTTYBREAK' AND CHEP.PROPERTY = 'SUCCESS'  
     AND CHEP.PROPERTYVALUE = 'FALSE'))   
     AND CHE.ADDDATE BETWEEN @lastweekstart AND @lastweekend  
     GROUP BY CHINFO.CHILDID 

enter image description here

任何建議????????????

編輯:

主鍵:

表名 - >的ColumnName

CHILDINFORMATION - > childID的

CHILDEVENTS - > EVENTID

CHILDEVENTPROPERITIES - > EventPropertyId

外鍵:

CHILDEVENTPROPERITIES - >這裏EVENTID是CHILDEVENTS表的外鍵引用

CHILDEVENTS - >這裏childID的是CHILDINFORMATION表

非聚集索引的外鍵引用:

CHILDINFORMATION - >沒有非聚集索引

ChildEventProperities - > IX_CHILDEVENTproperities_EventId - >事件ID

ChildEvents - > IX_ChildEvents_Type - >類型

ChildEvents - > IX_ChildEvents_Type_AddDate - >類型,ADDDATE

+0

你還嘗試過什麼嗎? – usr

+0

我已經嘗試過使用不同的組合創建索引,但沒有運氣 – Rooney

+1

我仍然在學習這方面的大部分內容,但是不是也取決於你的統計數據嗎?他們是最新的或設置爲自動?我們還討論了多少行?如果只有幾行,我認爲優化器會選擇執行掃描而不是查找。也許掃描是最佳方法? – ScubaManDan

回答

0

嘗試更換您的JOIN左連接?如果你使用GROUP BY

SELECT CHINFO.CHILDID, 
     COUNT(*) AS PREVIOUSWEEKSACCIDENTS  
FROM BKA.CHILDINFORMATION CHINFO  
LEFT JOIN BKA.CHILDEVENTS CHE  
     ON CHE.CHILDID = CHINFO.CHILDID   
LEFT JOIN BKA.CHILDEVENTPROPERITIES CHEP  
     ON CHE.EVENTID = CHEP.EVENTID   
WHERE (CHE.TYPE = 'ACCIDENT' OR (CHE.TYPE = 'POTTYBREAK' AND CHEP.PROPERTY = 'SUCCESS'  
     AND CHEP.PROPERTYVALUE = 'FALSE'))   
     AND CHE.ADDDATE BETWEEN @lastweekstart AND @lastweekend  
     GROUP BY CHINFO.CHILDID 
0

創建一個單列非聚集在CHILDEVENTS.ADDDATE索引中刪除DISTINCT。您當前的組合索引可能會被「或」拋出,或者在這兩個TYPE中缺少選擇性。如果您將TYPE添加爲索引的第二列,您可能會獲得一些改進。

現在,如果您剛剛啓動此係統並且CHILDEVENTS表中沒有任何重要數據,那麼它將進行掃描。