更新部分列的最佳实践

【 使用环境 】生产环境
【 OB or 其他组件 】OB
【 使用版本 】5.7.25-OceanBase-v4.3.5.0
【问题描述】
现在有一张表结构如下:

CREATE TABLE `t_realtime_tag_test_insert_partial_columns` (
  `user_key` varchar(64) NOT NULL COMMENT '用户键',
  `identity_code` varchar(64) NOT NULL COMMENT '身份代码',
  `rt_rs_299288032083968` text DEFAULT NULL,
  `rt_rs_299288059346945` text DEFAULT NULL,
  `rt_rs_299288059346943` text DEFAULT NULL,
  `rt_rs_299288059346946` text DEFAULT NULL,
  PRIMARY KEY (`user_key`, `identity_code`)
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC

表里有近1亿数据,rt_rs_299288059346943和rt_rs_299288059346946两个列是新创建的列。
现在想按照主键(user_key, identity_code) 去更新上述两个字段,两个字段的值每行每列都不一样。如果主键的行不存在,需要写入这行数据,没有值的字段留空。
想问下如何更新这张表效率最好,数据在内存里,也可以先写到一张临时表

1 个赞

针对这个场景,我建议是新建临时表比较合适,然后使用obloader --direct --parallel向目标表导入数据,旁路导入速度比较有保障
另外我能想到的就是下面这个,然后ON DUPLICATE KEY UPDATE做并发
/*+ ENABLE_PARALLEL_DML PARALLEL(8) */
INSERT INTO t_realtime_tag_test_insert_partial_columns
(user_key, identity_code, rt_rs_299288059346943, rt_rs_299288059346946)
SELECT
user_key, identity_code, rt_rs_299288059346943, rt_rs_299288059346946
FROM
tmp_update_data
ON DUPLICATE KEY UPDATE
rt_rs_299288059346943 = VALUES(rt_rs_299288059346943),
rt_rs_299288059346946 = VALUES(rt_rs_299288059346946);