我需要使用从唯一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_emails
和emails
之间有一个外键,ON DELETE CASCADE
.然后,您只需从emails
中删除,organisations_emails
中的匹配行将自动删除。
当然,假设外键适合您的架构。