我需要帮助来优化以下代码:
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个整数值)。
SELECT distinct OUTPUTDATACLASSID FROM SCADA.dbo.LIVEDATATABITEM where ENABLED = 0 and TABID =25设置为将在循环中使用的变量。我认为这将提高删除效率。
有人能告诉我怎么写这个脚本吗?在此之前非常感谢。
发布于 2018-10-12 14:05:43
您可以使用临时表(或表变量)来存储内部查询的结果。您可能还希望使用join而不是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必须强制执行外键约束。
https://stackoverflow.com/questions/52773135
复制相似问题