想知道以下两个DELETE
语句是否有任何性能差异?:
Delete by primary key:
DELETE FROM dbo.Users WHERE Id IN (1,2,3,4,5)
删除外键:
DELETE FROM dbo.Users WHERE Email_Id IN (454,851,909)
假设dbo.Users
表有3000万行,IN()
子句包含5-200K个条目。
是否有通过主键与其他字段删除的内置功能?
如果FK上没有唯一约束,我将使用PK。它保证对每个ID进行一次索引查找。FK可能有多个,所以如果FK索引存在的话,你需要对它进行扫描(它应该存在)。
因为你有这么多的记录要删除,优化器可能会决定表扫描是最快的,所以这并不重要。
要回答你的问题,是否有一些特殊的功能,使删除一种或另一种方式更好,答案是没有。选择是一回事,删除几乎是以相同的方式发生,无论你如何选择记录。截断表有时可以更快地完成,但这不是你要做的。
我将从优化select
开始获取查询计划
如果两者都做,它甚至会显示相对成本
我怀疑删除部分将花费比where更长的时间,所以它不会有太大的影响
select * FROM dbo.Users WHERE Id IN (1,2,3,4,5)
select * FROM dbo.Users WHERE Email_Id IN (454,851,909)
如果您有一个大的IN,您可能希望将其分解以包含事务日志
对于一个非常大的删除,你甚至可能最好禁用表上的索引,然后重建它们。禁用除PK以外的所有索引,并通过PK删除索引,然后重建索引