当前位置: 代码迷 >> Sql Server >> 执行效率解决思路
  详细解决方案

执行效率解决思路

热度:31   发布时间:2016-04-24 09:16:45.0
执行效率
IF EXISTS(SELECT * FROM dbo.Variable_Numeric 
  WHERE [TimeStamp] BETWEEN @StartTime AND @EndTime
                    And VariableID IN (SELECT ID 
   FROM dbo.VariableProperty 
                                   WHERE (URL+'\'+Name) LIKE @VariableURLExpression))
    Delete From dbo.Variable_Numeric
    Where TimeStamp BETWEEN @StartTime AND @EndTime
                    AND VariableID IN (SELECT ID 
   FROM dbo.VariableProperty 
                                   WHERE (URL+'\'+Name) LIKE @VariableURLExpression)


上面这段有执行有点慢,是不是like这种操作比较慢?  还是我的variableProperty要做点什么,使得查得快些,不过variableproperty这表不大,一般也就2000条左右
------解决思路----------------------
那你就考虑
imeStamp BETWEEN @StartTime AND @EndTime
                    AND VariableID IN (…………

这两个条件在Variable_Numeric 表上能否合理地用到索引

另外,你这个逻辑,没必要先判断再删除,你直接删除不就完了,有数据就删除,没数据执行delete也没影响
------解决思路----------------------
如1楼所说,没必要IF判断。然后对于DELETE语句,可以关注一下dbo.VariableProperty表和dbo.Variable_Numeric表JOIN的性能。dbo.Variable_Numeric表应该数据量较大吧?那么应该是会采用NESTED LOOP方式,检查一下VariableID列上有没有索引。
再就是TimeStamp列上的索引会影响按时间范围筛选的性能。可以分析一下执行计划,用你IF语句里的查询来分析就可以,跟DELETE的WHERE条件是一样的。

另外,子查询中“(URL+'\'+Name) LIKE @VariableURLExpression”这样的写法,不会使用到索引。但如你所说,dbo.VariableProperty表只有2000条记录的话,就没有优化的必要了。
------解决思路----------------------
要看执行计划是哪个地方导致慢
------解决思路----------------------
要使用索引,WHERE条件的左边不能是表达式或者函数,你子查询内部的WHERE条件可以修改为“WHERE URL LIKE ... AND NAME LIKE ...”,具体要看@VariableURLExpression的格式,可能会使用到CHARINDEX、LEFT、SUBSTRING之类的函数来解析字符串。
不过,在你目前的问题中,这个恐怕不是症结所在,建议重点关注外侧的SQL。
------解决思路----------------------
引用:
IF EXISTS(SELECT * FROM dbo.Variable_Numeric 
  WHERE [TimeStamp] BETWEEN @StartTime AND @EndTime
                    And VariableID IN (SELECT ID 
   FROM dbo.VariableProperty 
                                   WHERE (URL+'\'+Name) LIKE @VariableURLExpression))
    Delete From dbo.Variable_Numeric
    Where TimeStamp BETWEEN @StartTime AND @EndTime
                    AND VariableID IN (SELECT ID 
   FROM dbo.VariableProperty 
                                   WHERE (URL+'\'+Name) LIKE @VariableURLExpression)


上面这段有执行有点慢,是不是like这种操作比较慢?  还是我的variableProperty要做点什么,使得查得快些,不过variableproperty这表不大,一般也就2000条左右





IF EXISTS ( SELECT  *
            FROM    dbo.Variable_Numeric
            WHERE   [TimeStamp] BETWEEN @StartTime AND @EndTime
                    AND VariableID IN (
                    SELECT  ID
                    FROM    dbo.VariableProperty
                    WHERE   ( URL + '\' + Name ) LIKE @VariableURLExpression ) )
    DELETE  FROM dbo.Variable_Numeric
    WHERE   TimeStamp BETWEEN @StartTime AND @EndTime
            AND VariableID IN (
            SELECT  ID
            FROM    dbo.VariableProperty
            WHERE   ( URL + '\' + Name ) LIKE @VariableURLExpression )


--首先lz看一下执行计划,看看具体慢在哪儿。
--对应like这块,计算后在like 肯定是会慢的。如果不能修改这个结构
--建议lz建立一个索引视图,将 URL + '\' + Name设定为单独的字段,并填上索引,查找基于这个索引视图来做。

--in的地方也可以用exists来代替,或者用join连接的方式。这个要具体看表结构还有索引结构了。

--另外,这个语句的逻辑是,如果有就删除,直接使用下面的delete就好。没有上下文的前提下,判断貌似有点儿多余。


------解决思路----------------------
你写的这两个语句没有可比性,第一个涉及分组,是求每一个符合条件的VariableID最大的timestamp;第二个是只求固定的一个。
我看你最外层还套了一个MIN(tmprecordset.MaxTimeStamp),这样的意思是每个ID在Variable_Numeric表中的最大timestamp中最小的一个。假如一个URL表达式可能对应多个ID,而你不需要知道每个ID分别最大的timestamp,只是想知道所有的ID在Variable_Numeric表中的最大timestamp的话,就不需要用分组。直接写成:
SELECT MAX([TimeStamp])  
       FROM dbo.Variable_Numeric
               Where VariableID= (SELECT ID 
  FROM dbo.VariableProperty 
  WHERE URL+'\'+Name LIKE @VariableURLExpression)
  相关解决方案