Oracle 批量上传或更新操作(百万数据量也挺快7秒左右)
Posted 无恙_z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 批量上传或更新操作(百万数据量也挺快7秒左右)相关的知识,希望对你有一定的参考价值。
Oracle 批量上传或更新操作(这个版本适用于数据量很小的情况下,上万的数据量已经有点慢了)
别把 BEGIN 与 END 漏掉了,批量的话得用
<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秒左右)的主要内容,如果未能解决你的问题,请参考以下文章