我需要帮助来优化以下代码:
MegaDelete:
DELETE TOP (1000)
FROM SCADA.dbo.LOGSUMMATIONDATAENTRIES
where dataclassid IN (SELECT distinct OUTPUTDATACLASSID FROM SCADA.dbo.LIVEDATATABITEM where ENABLED = 0 and TABID =25)
IF @@ROWCOUNT>0 GOTO MegaDelete;
问题是:执行多次循环后,SQL Server变得越来越慢。 (SCADA.dbo.LOGSUMMATIONDATAENTRIES表中有数百万行)所以我想保存的结果(大约1500个INT值)
SELECT distinct OUTPUTDATACLASSID FROM SCADA.dbo.LIVEDATATABITEM where ENABLED = 0 and TABID =25
到将在循环中使用的变量。我认为这将提高DELETE的效率。
谁能告诉我如何编写脚本?提前谢谢。
答案 0 :(得分:1)
您可以使用临时表(或表变量)存储内部查询的结果。您可能还想使用联接而不是in
。
以下是为此使用临时表的方法:
SELECT distinct OUTPUTDATACLASSID
INTO #LIVEDATATABITEM
FROM SCADA.dbo.LIVEDATATABITEM
where ENABLED = 0
and TABID =25
MegaDelete:
DELETE TOP (1000) T
FROM SCADA.dbo.LOGSUMMATIONDATAENTRIES As T
JOIN #LIVEDATATABITEM ON dataclassid = OUTPUTDATACLASSID
IF @@ROWCOUNT>0 GOTO MegaDelete;
请注意,dataclassid
的索引也可能会提高此删除的性能,而且,每个具有LOGSUMMATIONDATAENTRIES
外键约束的表都会减慢删除速度,因为SQL Server必须强制执行外键约束。