是这种情况:我有一个包含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为您提供信息。
谢谢!
答案 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]