Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在sql server上运行sql时如何优化sql_Sql Server - Fatal编程技术网

Sql server 在sql server上运行sql时如何优化sql

Sql server 在sql server上运行sql时如何优化sql,sql-server,Sql Server,如何优化下面相同的sql代码: Declare @i int=0; while @i<10000 Begin Set @i=@i+1; set @ID=(Select top(1) ID from Products.dbo.TempID where IsUpdate=0); Delete from Attributes where ID=@ID; Delete from Products where ID=@ID Delete from Attributes_Archive where I

如何优化下面相同的sql代码:

Declare @i int=0;
while @i<10000
Begin
Set @i=@i+1;
set @ID=(Select top(1) ID from Products.dbo.TempID where IsUpdate=0);
Delete from Attributes where ID=@ID;
Delete from Products where ID=@ID
Delete from Attributes_Archive where ID=@ID
update TempID set IsUpdate=1 where ID=@ID
end

使用基于集合的查询而不是循环。在这种情况下,整个查询只执行一次,而不是执行10000次。比如:

DELETE  FROM Attributes
WHERE   ID IN ( SELECT  ID
                FROM    Products.dbo.TempID
                WHERE   IsUpdate = 0
                        AND ID < 10000 );
DELETE  FROM Products
WHERE   ID IN ( SELECT  ID
                FROM    Products.dbo.TempID
                WHERE   IsUpdate = 0
                        AND ID < 10000 );
DELETE  FROM Attributes_Archive
WHERE   ID IN ( SELECT  ID
                FROM    Products.dbo.TempID
                WHERE   IsUpdate = 0
                        AND ID < 10000 );
UPDATE  TempID
SET     IsUpdate = 1
WHERE   ID IN ( SELECT  ID
                FROM    Products.dbo.TempID
                WHERE   IsUpdate = 0
                        AND ID < 10000 );
或者,您可以先获取要删除/更新的ID,然后使用此列表,类似于:

SELECT  ID
INTO    #ids
FROM    Products.dbo.TempID
WHERE   IsUpdate = 0
        AND id < 10000;

DELETE  FROM Attributes
WHERE   ID IN ( SELECT  ID
                FROM    #ids );
...

告诉我们你到目前为止试过什么。同样的问题,我也试过了。但在执行过程中需要时间。