SQL查询需要数小时

时间:2017-05-17 13:44:56

标签: sql sql-server

我必须将C#Forms Programm从旧服务器移动到新服务器。它似乎工作,但现在虽然服务器有更好的硬件,SQL查询运行就像永远。我不是很喜欢SQL,但是当我调试代码时,以下查询似乎是最慢的。也许有人有解决方案或想法为什么它如此蹩脚......

这是基本的SQL:

DECLARE @id nvarchar(255); 
DECLARE @tag nvarchar(255); 
DECLARE curAuftr CURSOR FORWARD_ONLY 
FOR 
SELECT AUSF_TAG, SAP_ID FROM  TabellenName 
OPEN curAuftr 
FETCH NEXT FROM curAuftr INTO @tag, @id 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
UPDATE  TabellenName 
SET SummePersonal = 
(select Sum(Stunden) from LStunden 
WHERE 
convert(varchar(10), Datum, 104) LIKE @tag 
AND KFZInnenauftrag_Nummer LIKE @id 
AND NOT 
( Mitarbeiter_Kostenstelle LIKE (PC + '%') 
AND Mitarbeiter_Kostenstelle LIKE '%055' 
AND PC LIKE 'U%' ) 
)
WHERE 
AUSF_TAG = @tag
AND SAP_ID = @id 
FETCH NEXT FROM curAuftr INTO @tag, @id 
END 
CLOSE curAuftr 
DEALLOCATE curAuftr 

1 个答案:

答案 0 :(得分:1)

您尝试的是将一个查询作为update where语句的源。它是同一张桌子,我不知道你为什么这样做。 这会强制您使用该光标。更新可以更新多行。 仅将问题减少到更新命令。

为每一行执行创建总和的子查询。这是时间杀戮的一部分。创建一个子查询,该子查询创建总和并将结果也连接到更新。

Date to String转换的速度也很慢,将它与like命令进行比较。

未经测试的代码示例,因为您没有提供任何示例表:

UPDATE TabellenName
SET SummePersonal = StundenSumme
from TabellenName join 
(
select Sum(Stunden) as Stunden, convert(varchar(10), Datum, 104) as TAG, KFZInnenauftrag_Nummer as ID  from LStunden 
WHERE NOT ( Mitarbeiter_Kostenstelle LIKE (PC + '%') AND Mitarbeiter_Kostenstelle LIKE '%055' AND PC LIKE 'U%' ) 
group by convert(varchar(10), Datum, 104), KFZInnenauftrag_Nummer 
) summen
on TabellenName.AUSF_TAG=summen.tag and TabellenName.SAP_ID=summen.id)

尝试使用管理工作室并显示查询计划以查找瓶颈。