sql - 如何以最高效的方式从表中删除大量记录?
问题描述
情况就是这样:我有一个包含 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 为您提供信息。
提前致谢!
解决方案
由于您需要删除两个表中的行,因此您将需要 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
s 只删除一次。
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]
推荐阅读
- graph - 如何在 Amazon Neptune 中使用 Gremlin 有条件地添加顶点和多条边?
- angular - Angular Kendo Grid:以编程方式选择行
- python - 使用 Python3 提取和解析 JSON 数据
- mongodb - MongoDB:在数组中查找不是另一个集合中的_id的值
- javascript - 复制到剪贴板 jquery
- python - 我是否使用“os”和“shutil”删除了一些重要文件?
- java - AVL 搜索树在插入、平衡或旋转方面存在问题
- react-navigation - react-native run-android 命令通过在 android Device 中留下消息来终止
- python - 如何更改我的绘图图的 X 轴以表示在我的 pandas 数据框中存储为行标题的日期?2020 年 Python 财务食谱
- sql - HIVE 相关子查询