我必须将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
答案 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)
尝试使用管理工作室并显示查询计划以查找瓶颈。