[英]How to delete heavy records from a table in the most performant way?
情况是这样的:我有一个包含16,000行的表,一个带有4,000,000行的子表。 父表的列包含大量数据(这是用于几何图形的wkt)。 我需要定期清理数据,这时我需要删除5685个父行以及1,400,000个子行。 我正在努力编写性能最高的查询来实现这一目标。 我当前的方法是这样的:
1)从需要删除的行中获取父表中的所有ID。
从ParentTable中选择SELECT,ValidTo,其中ValidTo <someDate;
2)对于每个ID,我发现我正在执行以下命令:
从ChildTable删除,其中ParentId = IdFromStepOne;
从ParentTable删除Id = IdFromStepOne
95-100条记录需要15分钟,因此它将在14小时内完成。 我正在.Net Core中进行编码,并使用Entitiy Framework为您提供信息。
提前致谢!
您的查询显示您正在遍历每个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)
由于您需要删除两个表中的行,因此将需要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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.