如何解决如何根据多个条件从SQL Server中删除大量数据
我正在寻找一个 sql 查询,我必须根据 2 个条件的组合从表中删除数据。
我有一个表 dbo.ABC
,如果值的组合作为 A 列和 B 列中的输入传递,我必须从中删除行。
表格 - ABC
column A column B
===========================
100 US
200 IND
如果 A 列是 100,B 列是 US,我现在必须删除记录。但我想分别将多个输入(如 100 和 200)作为 A 列传递,将 US 和 IND 作为 B 列传递。 100 和 US 将是删除第 1 条记录的一个组合,200 和 IND 将是删除 2 条记录的另一个组合。同样,我想通过这种方式传递 1000 条输入以单次删除 1000 条记录,而不是单次输入调用 1000 次。
由于column_A
和column_B
有多个组合,我可以使用多个IN语句来删除数据吗?
如果我传递多个column_A
和column_B
的组合,如何使用for循环删除数据?
我是这个领域的新手,所以没有太多的知识。
您的帮助将不胜感激..
谢谢。
解决方法
请注意:我还没有调试过这个。但是我在繁忙的事务数据库上使用了类似的东西进行大规模清除操作。
为自己创建一个临时表并用您要删除的组合填充它。例如,
CREATE TABLE #to_delete ( cola INT NOT NULL,colb NVARCHAR(200) NOT NULL);
GO
INSERT INTO #to_delete (cola,colb) VALUES
(100,N'US'),(200,N'CN'),(300,N'UK');
GO
然后执行此操作以测试您的行选择逻辑。这应该只返回您要删除的行。
SELECT TOP(500) ABC.*
FROM ABC
JOIN #to_delete d ON ABC.col1 = d.col1 AND ABC.col2 = d.col2;
一旦你感到满意,这只会得到注定的行,然后进行所谓的蚕食删除。在循环中重复删除查询,直到它不删除任何内容。像这样。
DECLARE @count INT = 1;
WHILE @count > 0 BEGIN
WAITFOR DELAY '00:00:02';
BEGIN TRANSACTION;
SET DEADLOCK_PRIORITY LOW;
DELETE TOP(500) ABC
FROM ABC
JOIN #to_delete d ON ABC.col1 = d.col1 AND ABC.col2 = d.col2;
SET @count = @@ROWCOUNT;
COMMIT TRANSACTION;
END;
为什么这是一个好方法?
- 它会在每次查询时删除一小块行,从而最大限度地减少表中行的锁定时间和每个删除事务的大小。
- 低死锁优先级只是保险。如果这些 DELETE 操作之一与其他查询(可能在某个索引上)发生死锁,我们肯定要终止 DELETE 操作,而不是其他查询。我们可以重复 DELETE 查询。
- 块之间的短暂延迟让您的事务工作负载有时间运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。