【问题标题】:Read and update an Oracle table with 20 millions records读取和更新包含 2000 万条记录的 Oracle 表
【发布时间】:2019-12-12 15:29:58
【问题描述】:

我有一种情况,我正在从备份中修复数据。

表 MAIN TABLE (PrimaryKey, Value) 和表 BACKUP(PRIMARYKEY, Value)。

我想在主表中找到 value=0 的所有记录,然后从表 BACKUP 中获取相同主键的值并更新主表。

  1. 有 2000 万条 value=0 的记录
  2. 更新和获取都使用主键完成

问题

  1. 存储过程?脚本?

  2. 获取和更新是在同一张表上完成的吗?有什么问题吗?

  3. 您认为这需要多长时间 - 棒球场数字。如何测试?

我在想的解决方案:

使用我的条件(值 = 0)在表 Main 上打开一个游标,然后从 BACKUP 中获取值,然后进行更新。在循环中提交每 10K 更新

有什么想法吗?

【问题讨论】:

  • “有 2000 万条 value=0 的记录” - 那么value <> 0 有多少?
  • 您可以进行服务中断吗? MAIN 表是否必须 24/7 可用?
  • @APC - 500 万
  • @PavelBrziák。如果这需要发生,我们可以要求一个。你认为我们需要一次服务中断。记录仅添加到此表中 - 从未更新

标签: oracle performance bulk-operations


【解决方案1】:

你可以试试Oracle的MERGE。

确保在将查询应用于主表之前在测试表中进行测试。

MERGE INTO main_table m
USING backup_table b
ON (m.primary_key = b.primary_key)
WHEN MATCHED THEN
    UPDATE SET m.value = b.value 
    WHERE m.value = 0;

【讨论】:

  • 我们可以等到它完全运行后再提交吗?这似乎是很多数据?
  • 我在一个有 10M 行的表上使用了这个查询,我不记得它需要很长时间来执行。我一直等到最后才承诺。
  • 给我一个球场时间?比如不到 30 分钟?
  • 我的估计不到 10 分钟。我可以说不到 5 分钟,但我不确定。
  • 感谢输入。我将采用上述合并查询方法并随时通知您。我还在阅读以下建议:启用并行 DML 和强制并行 DML 并行 16。有什么想法吗?
【解决方案2】:
UPDATE MAIN_TABLE 
SET main.value=back.value
FROM MAIN_TABLE as main
JOIN BACKUP_TABLE as back ON main.pk=back.pk
WHERE main.value=0

我在这里找到了如何做到这一点: https://chartio.com/resources/tutorials/how-to-update-from-select-in-sql-server/

【讨论】:

  • 标签清楚地写着oracle。您建议使用 SQL Server 解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多