如何通过正确索引来提高此查询性能?

时间:2014-05-20 07:05:35

标签: sql sql-server-2008 tsql indexing

您好,我有一个查询,我需要提高此查询的性能。任何人都建议我如何将聚集索引扫描转换为索引搜索。

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

任何建议????????????

编辑:

主键:

TableName - >的ColumnName

CHILDINFORMATION - > childID的

CHILDEVENTS - > EVENTID

CHILDEVENTPROPERITIES - > EventPropertyId

外键:

CHILDEVENTPROPERITIES - >这里EventId是CHILDEVENTS表的外键引用

CHILDEVENTS - >这里ChildId是CHILDINFORMATION表的外键引用

NonClustered Indexes:

CHILDINFORMATION - >没有非聚集索引

ChildEventProperities - > IX_CHILDEVENTproperities_EventId - >事件ID

ChildEvents - > IX_ChildEvents_Type - >类型

ChildEvents - > IX_ChildEvents_Type_AddDate - >类型,ADDDATE

2 个答案:

答案 0 :(得分:0)

尝试将您的JOIN替换为LEFT JOIN?如果您使用GROUP BY

,请删除DISTINCT
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

答案 1 :(得分:0)

在CHILDEVENTS.ADDDATE上创建单列非聚簇索引。您当前的综合指数可能被"或"或者对这两种TYPE缺乏选择性。如果将TYPE添加为索引的第二列,则可能会得到一些改进。

现在,如果您刚刚启动此系统并且在CHILDEVENTS表中没有任何重要数据,那么它将会扫描。