sql server语言 - sql:根据主键和外键性能进行删除



想知道以下两个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删除索引,然后重建索引

相关内容

  • 没有找到相关文章

最新更新