Oracle 批量上传或更新操作(百万数据量也挺快7秒左右)

Posted 无恙_z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 批量上传或更新操作(百万数据量也挺快7秒左右)相关的知识,希望对你有一定的参考价值。

Oracle 批量上传或更新操作(这个版本适用于数据量很小的情况下,上万的数据量已经有点慢了)

别把 BEGINEND 漏掉了,批量的话得用

    <insert id="对应 Mapper 层方法名" parameterType="java.util.List" >
        BEGIN
            <foreach collection='list' item='item' separator=';'> MERGE INTO 表名 T USING
            (SELECT
            SYS_GUID() AS UUID,
            #{item.xxx,jdbcType=VARCHAR} AS xxx,
            #{item.xxx,jdbcType=VARCHAR} AS xxx,
            #{item.xxx,jdbcType=VARCHAR} AS xxx,
            ...
            FROM DUAL ) T1 (T1 为虚拟表,即你要上传的数据)
            ON
            (T1.xxx = T.xxx AND T1.xxx= T.xxx AND ...)
            WHEN MATCHED THEN (满足 ON 的条件就更新)
            UPDATE SET  T.xxx= T1.xxx,T.xxx= T1.xxx,...
            WHEN NOT MATCHED THEN (不满足就插入)
            INSERT
            (要插入的字段)
            VALUES
            (T1.UUID,T1.xxx,...)
            </foreach>;
        END;
    </insert>

推荐方案:既然要数据存在就更新,不存在就插入的话,那就直接先插入再删除重复数据吧(理由:Update 十分消耗资源,能不用就不用)

插入的话 Mybatis-Plus 提供了saveBatch方法,挺快的。

删除重复数据(方式一):

<delete id="对应 Mapper 层方法名">
    delete from 表名 a
    where (a.aaa,a.bbb,a.ccc) in
    (
        select aaa,bbb,ccc
        from 表名
        group by aaa,bbb,ccc having count(*) > 1)
        and rowid not in (select max(rowid) from 表名 group by aaa,bbb,ccc having count(*)>1
    )
</delete>

删除重复数据(方式二,只给了思路,代码自行百度):

上面的方式一是直接在原表操作,数据量到千万级别效率就不太理想。因此可以用建立临时表的方法,临时表装的是原表里无重复的数据,然后清空原表,将临时表里的数据装入原表中,最后删除临时表。

以上是关于Oracle 批量上传或更新操作(百万数据量也挺快7秒左右)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 批量上传或更新操作(速度可观)

oracle几百万条数据怎么update

如何更新几十万上百万的数据在ORACLE和MYSQL

如何加速Oracle大批量数据处理?

oracle 如何实现对单个表批量更新

几款好用的大数据报表工具