DB2 - 摄取与更新

Posted

技术标签:

【中文标题】DB2 - 摄取与更新【英文标题】:DB2 - Ingest vs Update 【发布时间】:2021-01-04 19:26:55 【问题描述】:

在使用 DB2 时,我有 2 个表:

TABLE_A >

2 列:CLAIM_ID、CODEID_A

TABLE_B >

2 列:CLAIM_ID、CODEID_B

目标是编写一个 DB2 Update 语句,检查 TABLE_A 的 CLAIM_ID 是否与 TABLE_B 的 CLAIM_ID 相同,然后将 CODEID_A(TABLE_A 的 CLAIM_ID)替换为 CODEID_B(TABLE_B 的 CLAIM_ID)。

TABLE_A 和 TABLE_B 都有大约 4 亿行。 VSch 是架构名称。

发现相关子查询应该可以工作:

UPDATE MY_SCHEMA.TABLE_A apc SET CODEID_A = (SELECT TABLE_B.CODEID_B FROM SCHEMA_2.TABLE_B TABLE_B 
  WHERE TABLE_B.CLAIM_ID = apc.CLAIM_ID)
  WHERE EXISTS (SELECT 1 FROM SCHEMA_2.TABLE_B TABLE_B WHERE (TABLE_B.CLAIM_ID = apc.CLAIM_ID));

以下是两个表 - TableA 和 TableB 中 Column 结构和索引的详细信息: https://codeshare.io/armxAv

我的问题是,如果我们在这里使用 Ingest 而不是 Update,会更快吗?

如果我们通过 DB2 Ingest 路由,我们可以首先 DB2 将要更新的值列表从 TABLE_B 提取到 FLAT 文件中,然后从该 FLAT 文件执行 DB2 INGEST 到 TABLE_A。


就时间复杂度而言,这是一种有效的方法吗?如果是,有人可以帮助我处理相同的 Ingest 查询吗?

【问题讨论】:

您可能会发现创建和读取平面文件比仅使用 sql 需要更长的时间。 编辑您的问题以提高其准确性。具体说明 TableA 或 TableB 是否有索引,在哪些列上,以及这些索引是否是唯一的。如果没有唯一索引,说明应该发生什么,然后两个表中都存在相同的 ClaimsId,但该 ClaimsID 在表 B 中有多个不同的 CodeId。在几乎所有的情况下,在数据库中做事比提取和摄取要快得多。但是您必须完全指定数据的可能性以使查询正确。未记录的会话表对于数据编组非常有帮助。 嘿@mao,你能解释一下这种情况下“未记录的会话表”的概念吗? 编辑您的问题以完整、清楚地回答我上面提到的说明。 TableA 是行组织表还是列组织表?列组织表的更新存在限制,更新仅在带来 uniq 行时才使用索引。 ibm.com/support/knowledgecenter/SSEPGG_11.1.0/…(FETCH 运算符不支持在列组织表上使用索引扫描的更新和删除操作。使用仅索引访问或嵌套-循环获取方法。) 【参考方案1】:

您也可以考虑使用MERGE 语句

MERGE INTO tablea a 
   USING (SELECT claimsid_b, codeid_b FROM tableb) b 
   ON (a.claimsid_a = b.claimsid_b) 
   WHEN MATCHED THEN  
     UPDATE SET 
        a.codeid_a = b.codeid_b 

PS。没有测试,直接在这里输入..但你明白了......

【讨论】:

就有效性(时间复杂度)而言,哪种情况(Merge、Update 或 Ingest)更适合这种情况? 这并不是问题的真正答案。他们询问摄取是否比使用直接 sql 更有效。

以上是关于DB2 - 摄取与更新的主要内容,如果未能解决你的问题,请参考以下文章

MySQLWorkbench如何在每次摄取新数据时创建仅更新日期列

Mysql 更新与 db2 转换的连接

如何使用 Apache Apex 将数据从 DB2 批量摄取到 Vertica

DB2 SQL更新与子查询相关的多于1列[duplicate]

Db2/sql:使用连接选择和更新最旧的条目

如何在 DB2 的单个更新语句中更新多个列