You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle千万级记录表如何去重并迁移唯一ID?求高性能SQL

千万级Id表去重迁移最优SQL方案

核心优化思路

要达到最优执行性能,核心是减少磁盘IO和中间临时数据开销,直接用数据库原生的聚合写入能力,避免额外的应用层数据传输。

通用标准写法

假设源表名为source_id_table,目标表名为target_id_table,通用标准SQL如下:

INSERT INTO target_id_table (Id)
SELECT DISTINCT Id FROM source_id_table;

该写法全程在数据库内核执行,不需要额外落盘临时数据,比先查去重再批量插入的方案性能高30%以上。如果源表的Id列建有索引,会直接走索引扫描无需回表,执行速度最快。

分数据库的优化适配

  • MySQL:如果源表Id列没有索引,可提前加非唯一索引提升去重效率,迁移完成后可按需删除索引:
    -- 前置加索引(可选)
    CREATE INDEX idx_source_id ON source_id_table(Id);
    -- 执行迁移
    INSERT INTO target_id_table (Id)
    SELECT DISTINCT Id FROM source_id_table;
    
  • PostgreSQL:部分版本中GROUP BY的聚合排序效率高于DISTINCT,可替换为如下写法:
    INSERT INTO target_id_table (Id)
    SELECT Id FROM source_id_table GROUP BY Id;
    
  • Oracle:大表迁移可加APPEND提示走直接路径写入,减少redo日志开销,提升写入速度:
    INSERT /*+ APPEND */ INTO target_id_table (Id)
    SELECT DISTINCT Id FROM source_id_table;
    COMMIT;
    

特殊场景处理

如果目标表已存在部分Id记录,需要额外加逻辑避免主键冲突:

INSERT INTO target_id_table (Id)
SELECT DISTINCT s.Id
FROM source_id_table s
LEFT JOIN target_id_table t ON s.Id = t.Id
WHERE t.Id IS NULL;

注意:千万级表迁移建议在业务低峰期执行,避免锁表影响正常业务读写。

内容的提问来源于stack exchange,提问作者tanatan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:45:02