函数与in子句中SP的条件降低程序性能

时间:2015-10-14 10:56:50

标签: sql sql-server-2008

我的程序在where条件中具有以下功能:

select col1,col2,col3...
from table1
where
(dbo.GetFilStatus(et.SgDate,et.Speed,(SELECT COUNT(J.JId) FROM tbl_Nt J 
               inner JOIN tbl_NAssign JN ON  JN.NNo =J.NNo
               inner JOIN dbo.tbl_CStatus JS ON JS.CStatusID=J.CStatusID 
               INNER JOIN dbo.tbl_SStatus ss ON ss.SStatusID=JS.SStatusID
               WHERE JN.DriID=et.DriID AND ss.SStatusID !=9),et.IgStatus) 
              in (Select val from Split('A,B,C,D,E',',')))
              )

getfilstatus状态包含以下代码: -

 if (@ServerDatetime <= DATEADD(MI,-10, GETDATE()))
           BEGIN
           IF(@xIgStatus = 'ON')
           BEGIN
             set @FilStatus= 'NoSignal'
             END
             ELSE
             BEGIN
              set @FilStatus= 'Stopped'
             end
           End
        else IF(@xIgStatus = 'ON')     
           Begin
           if(@Speed>5)
           begin
               if(@JCount<=0)
                 set @FilStatus='Moving'
               else 
                 set @FilStatus='Working' 
           end 
           else
           begin
           set @FilStatus= 'Idle'
           end                   
           End
        else 
           Begin
                 set @FilStatus= 'Stopped'
           end  
    RETURN @FilStatus

GetFilStatus始终返回超过10000条记录。有时它超过100000.它减慢了查询的最终输出。目前它需要2分钟以上才能恢复输出 我正在搜索任何其他选项或任何其他技巧,使用它可以增加查询性能,我可以在几秒钟内得到输出 有什么建议?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最好将拆分项放在临时表中,因为拆分函数需要在查询迭代中每次执行。

第三个参数有一个复杂的内联查询,我为子集数据创建了一个临时表,并内联过滤了必要的数据。

SELECT S.items AS value 
INTO   #splited_items 
FROM   Split('A,B,C,D,E', ',') S; 

SELECT Count(J.jid) AS Count_JId, 
       JN.driid     AS DriID 
INTO   #joined_table 
FROM   tbl_nt J 
       INNER JOIN tbl_nassign JN 
               ON JN.nno = J.nno 
       INNER JOIN dbo.tbl_cstatus JS 
               ON JS.cstatusid = J.cstatusid 
       INNER JOIN dbo.tbl_sstatus ss 
               ON ss.sstatusid = JS.sstatusid 
WHERE  ss.sstatusid != 9 
GROUP  BY JN.driid 

SELECT col1, 
       col2, 
       col3... from table1 
WHERE  ( dbo.Getfilstatus(et.sgdate, et.speed, (SELECT count_jid 
                                                FROM   #joined_table 
                                                WHERE  driid = et.driid), 
         et.igstatus) 
                IN (SELECT value 
                  FROM   #splited_items) )