【问题标题】:How to improve this queries performance by indexing properly?如何通过正确索引来提高此查询性能?
【发布时间】:2014-05-20 07:05:34
【问题描述】:

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

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

有什么建议吗????????????

编辑:

主键:

表名 --> 列名

CHILDINFORMATION-->ChildId

CHILDEVENTS-->EventId

CHILDEVENTPROPERITIES-->EventPropertyId

外键:

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

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

非聚集索引:

CHILDINFORMATION-->没有非聚集索引

ChildEventProperities-->IX_CHILDEVENTproperities_EventId-->EventID

ChildEvents-->IX_ChildEvents_Type-->类型

ChildEvents-->IX_ChildEvents_Type_AddDate-->Type,AddDate

【问题讨论】:

  • 你有没有尝试过?
  • 我尝试使用不同的组合创建索引,但没有成功
  • 我还在学习这方面的很多东西,但这不也取决于你的统计数据吗?它们是最新的还是设置为自动的?还有多少行我们在谈论?如果只有几行,我想优化器会选择进行扫描而不是搜索。也许扫描是最佳方法?

标签: sql sql-server-2008 tsql indexing


【解决方案1】:

尝试将您的 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

【讨论】:

    【解决方案2】:

    在 CHILDEVENTS.ADDDATE 上创建单列非聚集索引。您当前的复合索引可能会因“或”或这两种类型缺乏选择性而被抛弃。如果将 TYPE 添加为索引的第二列,您可能会得到一些改进。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      相关资源
      最近更新 更多