1.情景展示
一共有22w条数据, 需要将A表的主键更新至B表的指定字段,如何快速完成更新?
2.解决方案
声明:
解决方案不只一种,该文章只介绍快速游标法及代码实现;
两张表的ID和ID_CARD字段都建立了索引。
方式一:使用隐式游标(更新一次提交1次)
--快速游标法
BEGIN
FOR TEMP_CURSOR IN (SELECT T2.ID, T2.ID_CARD
FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
WHERE T1.ID_CARD = T2.ID_CARD
AND T1.REMARK = '**市****区数据'
AND T2.REMARK = '**市****区数据') LOOP
/* LOOP循环的是TEMP_CURSOR(逐条读取TEMP_CURSOR) */
UPDATE VIRTUAL_CARD10
SET INDEX_ID = TEMP_CURSOR.ID
WHERE ID_CARD = TEMP_CURSOR.ID_CARD;
COMMIT; --提交
END LOOP;
END;
执行时间:
方式二:使用隐式游标(更新1000次提交1次)(推荐使用)
/* 使用隐式游标进行分批次更新 */
DECLARE
V_COUNT NUMBER(10);
BEGIN
/* 隐式游标 */
FOR TEMP_CURSOR IN (SELECT T2.ID, T2.ID_CARD
FROM VIRTUAL_CARD10 T1, PRIMARY_INDEX10 T2
WHERE T1.ID_CARD = T2.ID_CARD
AND T1.REMARK = '**市****区数据'
AND T2.REMARK = '**市****区数据') LOOP
/* 业务逻辑 */
UPDATE VIRTUAL_CARD10
SET INDEX_ID = TEMP_CURSOR.ID
WHERE ID_CARD = TEMP_CURSOR.ID_CARD;
/* 更新一次,+1 */
V_COUNT := V_COUNT + 1;
/* 1000条提交1次 */