我的程序在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分钟以上才能恢复输出
我正在搜索任何其他选项或任何其他技巧,使用它可以增加查询性能,我可以在几秒钟内得到输出
有什么建议?有什么想法吗?
答案 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) )