如何以最高效的方式从表中删除大量记录?

时间:2018-08-10 07:27:28

标签: sql database entity-framework sql-delete database-performance

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

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

  

SELECT ID,来自ParentTable的ValidTo,其中ValidTo

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

  

从ChildTable中删除,其中ParentId = IdFromStepOne;

     

从ParentTable中删除Id = IdFromStepOne

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

谢谢!

2 个答案:

答案 0 :(得分:0)

查询显示您正在遍历每个id并删除子行和父行。

使用IN子句对多个值执行该操作。

    DELETE FROM ChildTable WHERE ParentId in (SELECT Id From ParentTable Where ValidTo < someDate)

    DELETE FROM ParentTable WHERE Id in (SELECT Id From ParentTable Where ValidTo < someDate)

答案 1 :(得分:0)

由于您需要删除两个表中的行,因此需要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的Id仅删除一次。

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]