【问题标题】:Function with in clause in where condition of SP decreasing the procedure performance在 SP 的 where 条件下带有 in 子句的函数会降低过程性能
【发布时间】:2016-01-12 10:25:09
【问题描述】:

我有一个在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 status 包含以下代码:-

 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 分钟。
我正在寻找可以提高查询性能的任何其他选项或任何其他技巧,并且可以在几秒钟内获得输出。
有什么建议?有什么想法吗?

【问题讨论】:

  • Put (Select val from Split('A,B,C,D,E',',')) output in a Temp Table ..
  • 从该常量 split() 表达式预派生一个表将是一个起点
  • 您在哪个数据库上工作?
  • 我正在使用 sql server 2008
  • 更多推荐,功能dbo.GetFilStatus的内容需要分享。

标签: sql sql-server-2008


【解决方案1】:

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

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

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) ) 

【讨论】:

猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 2012-07-02
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多