首页 > 解决方案 > 如何以最高效的方式从表中删除大量记录?

问题描述

情况就是这样:我有一个包含 16,000 行的表,以及一个包含 4,000,000 行的子表。父表有一列包含大量数据(它是一个 wkt,用于几何)。我需要定期清理数据,此时我需要删除 5685 个父行以及 1,400,000 个子行。我正在努力编写性能最高的查询来实现这一目标。我目前的方法是这样的:

1)从需要删除的行中获取父表中的所有id。

SELECT Id, ValidTo From ParentTable where ValidTo < someDate;

2)对于每个 id 我发现我正在执行以下命令:

从 ChildTable 中删除 ParentId = IdFromStepOne;

从父表中删除,其中 Id = IdFromStepOne

95-100 条记录需要 15 分钟,因此将在 14 小时内完成。这可以写得更高效吗?我在 .Net Core 中编码并使用 Entity Framework 为您提供信息。

提前致谢!

标签: sqldatabaseentity-frameworksql-deletedatabase-performance

解决方案


由于您需要删除两个表中的行,因此您将需要 2 个查询,并且SELECT查询不需要选择ValidTo列,而只需选择 Id。

我会写这些查询:

DELETE FROM ChildTable ct
WHERE EXISTS (SELECT pt.Id FROM ParentTable pt WHERE ct.Id_parent = pt.Id AND pt.ValidTo < someDate);

DELETE FROM ParentTable
WHERE ValidTo < someDate;

使用 pl/sql 你应该能够选择 ParentTable 的Ids 只删除一次。

Query1 => SELECT Id FROM ParentTable WHERE ValidTo < someDate
Query2 => DElETE FROM ChildTable WHERE id_parent IN [results of Query 1]
Query3 => DELETE FROM ParentTable WHERE Id IN [results of Query 1]

推荐阅读