SQL Server - 使用相同的 SELECT 结果运行两个 DELETE 语句的最佳方法



我需要使用从唯一SELECT查询中找到的一些ids两个表中删除条目。

使用 SQL Server 执行此操作的最高性能方法是什么?

我目前使用Table Variable

DECLARE @emailIdsToDelete TABLE(id int NOT NULL);
INSERT INTO @emailIdsToDelete
SELECT id
FROM ...;
DELETE organisations_emails
FROM @emailIdsToDelete etd
INNER JOIN ...;
DELETE emails
FROM @emailIdsToDelete etd
INNER JOIN ...;

但是由于我只需要该表来存储SELECT的结果,并且仅用于此特定查询的范围,因此我想知道是否有性能更高的解决方案。

我想我不能使用CTE(使用"with()"子句),因为它只允许一个以下语句,而不是两个。

有没有办法从这两个表中删除,而不必先创建临时表?某种join?还是我的解决方案已经是最佳的?

更新:假设这些表之间没有"ON DELETE CASCADE"。

Cascade Delete

是一个选项,但是您需要进行测试以验证它的性能是否更高,有时即使使用 FK,也会留下孤立记录。

Soft Delete您可以添加一个isDeleteFlag列,将其设置为bit default(0)并在运行查询时将其更新为 1,再次必须对其进行测试。如果你想停在那里,你需要改变你的usp_以适应不返回这些记录。where isDeleteFlag = 0

若要跟进性能最高的操作,可以使用软删除,然后在晚上执行较小批次的删除,也可以将删除 ID 存储在单独的表中,并在晚上分批删除它们。这可能对你有用,这取决于你想要完成什么,如果可以在晚上而不是在正常的业务运营期间窃取性能,有时它是不可行的。

最后,答案是这取决于里程会有所不同,您需要测试解决方案以比较性能。

或者,您可以使用您的方法并使用变量表/临时表或用户定义的表类型。

编辑:您还可以在事务中输出已删除的ID和菊花链删除。

另一种方法是在organisations_emailsemails之间有一个外键,ON DELETE CASCADE.然后,您只需从emails中删除,organisations_emails中的匹配行将自动删除。

当然,假设外键适合您的架构。

最新更新