sql-server - 如何在 sql server 上运行时优化 sql
问题描述
如何优化下面相同的代码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 );
...
推荐阅读
- css - 如何在 CSS 中将多个图像移回中心?
- swift - 存档的应用程序不显示任何窗口内容,在 Xcode 上运行时运行良好
- html - 对齐 div 标签,需要在表单后放置水平标签
- r - NLS 几乎适合
- node.js - Node.js 项目 zip 未能作为 Azure WebJob 上传
- graphviz - Graphviz:如何为不同集群中的节点赋予相同的等级
- symfony - 为 Symfony Messenger 使用默认传输(跳过 amqp)
- jquery - 仅使用对象唯一值对数组项进行分组
- php - 如何使用按钮选择列表的最新或下一个元素
- excel - 我可以使用数组来使用 like 运算符比较多个条件吗?