performance - 需要输入以更快地删除批量数据
问题描述
数据库:Oracle 11g
设想:
- TABLE_A 有大约 5000 万条记录
- TABLE_A 有 COLUMN_A、COLUMN_B、COLUMN_C、COLUMN_D、COLUMN_E
- COLUMN_A 是 TABLE_A 的主键
我们需要从 TABLE_A 中删除大约 3000 万条记录
因此,我们创建了另一个表 TABLE_B TABLE_B 具有 COLUMN_A,其中所有 GUID 都符合基于 TABLE_A.COLUMN_A 从 TABLE_A 中删除的条件 TABLE_B 具有另一列 QUALIFIER,该列填充了从 1 到最大记录数的序列,例如 3000 万 TABLE_B 也是范围based 基于 QUALIFIER 列进行分区。每个范围分为 300 万条记录
在上述情况下,以下哪种方法是删除记录的最有效方法。我们计划在一个周末以最少的停机时间执行此任务,并避免由于批量删除而导致的任何段空间问题:
方法一:使用不带任何条件的直接删除语句如下Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B)
另外,我们是否可以使用并行提示来提高性能:
Delete /*+ parallel first_rows*/ from TABLE_A where COLUMN_A in (select /*+ parallel first_rows*/ COLUMN_A from TABLE_B);
方法二:通过根据 QUALIFIER 列计数范围拆分数据来删除 TABLE_A 中的记录,以避免出现段空间问题(如果有)。并且记录可以在迭代中删除。
Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 1 and 300000); Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 300001 and 600000); Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 600001 and 900000);
等等,直到
Delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B where QUALIFIER between 2700001 and 3000000);
另外,我们是否可以在上述删除语句中使用并行提示来提高性能
方法三:根据 TABLE_B 上的分区拆分数据,从 TABLE_A 中删除记录
delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_1)); delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_2)); delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_3));
等等,直到
delete from TABLE_A where COLUMN_A in (select COLUMN_A from TABLE_B PARTITION (TABLE_B_PARTITION_10));
另外,我们是否可以在上述删除语句中使用并行提示来提高性能
对于上述情况,还有其他更好的方法可以遵循吗?
解决方案
推荐阅读
- mysql - 根据目标数据库中的 where 条件将表数据从一个数据库复制到另一个数据库
- python-3.x - 如何将 excel/csv 文件作为函数参数传递?
- php - 按产品名称获取产品 ID(转义特殊字符)
- c# - 运行 Scaffold DBContext 而不覆盖实体框架核心中的自定义代码
- android - 如何解决 Kotlin 的膨胀类错误?
- javascript - 更新 mobx 存储值后,组件的 render() 没有被调用
- angular - 类构造函数 AnimationEngine 不能在没有 new 的情况下被调用
- kibana - 在 Elastalert 计划间隔选项中丢失
- ionic-framework - 离子标头,如何使用整个屏幕
- python - 通过按索引省略值来过滤列表