您好,我有一个查询,我需要提高此查询的性能。任何人都建议我如何将聚集索引扫描转换为索引搜索。
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
任何建议????????????
编辑:
主键:
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
答案 0 :(得分:0)
尝试将您的JOIN替换为LEFT JOIN?如果您使用GROUP BY
,请删除DISTINCTSELECT 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表中没有任何重要数据,那么它将会扫描。