从数据库中删除未引用的数据

Posted

技术标签:

【中文标题】从数据库中删除未引用的数据【英文标题】:Deleting non referenced data from database 【发布时间】:2016-08-29 17:37:05 【问题描述】:

由于设计不好,我必须清理数据库。那里的数据未正确“连接”(未设置外键) 因此,我想删除所有未引用的数据。 我创建了一个连接临时表temp1 并插入了所有与主表entity 没有连接的Entity_ID。下一步是,我想通过以下查询从entityisactive 中删除所有不良数据:

Delete from db1.entityisactive where db1.entityisactive.Entity_ID IN
(
Select db1.temp1.Entity_ID from db1.temp1 
)

问题是,我连接超时了,当我这样做的时候Select db1.temp1.Entity_ID from db1.temp1 where Entity_ID = 42

我想要做的是删除entityisactiveentityisactive.Entity_ID = temp1.Entity_ID中的所有条目

如何加快 SQL 查询的速度?或者我的推理错误在哪里?

【问题讨论】:

您可以创建索引并使用 NOT IN 但不是 NOT IN 会非常危险 尝试限制内部查询的结果数量,然后多次运行直到它什么都不删除:Select db1.temp1.Entity_ID from db1.temp1 LIMIT 1000 不在的危险:***.com/a/32175659 @Drew OP 没有询问 NOT IN @alfasin 我警告使用它 【参考方案1】:

我建议使用明确的join,然后定义索引。代码如下所示:

Delete eia
    from db1.entityisactive eia join
         db1.temp1 t
         on eia.Entity_ID = t.Entity_ID ;

然后,此查询需要temp1(Entity_Id)entityisactive(Entity_Id) 上的索引。两个索引都不是必需的,第二个可能有更好的性能。

【讨论】:

我在entityisactive 表上有索引。坦克的答案,它工作完美。

以上是关于从数据库中删除未引用的数据的主要内容,如果未能解决你的问题,请参考以下文章

记一次数据库图片引用和服务器文件对比 删除未引用的服务器图片1

从 Visual Studio 项目中的项目中删除所有未使用的引用

删除核心数据中所有未提交的实体[重复]

如何从表和所有引用中删除数据? [关闭]

为啥不能在 C# 中删除未使用的引用

Django:从数据库中安全地删除未使用的表