10W 数据导入该如何与库中数据去重?
使用的是 PostgreSQL
在做大数据量(十万级)导入时,某些字段和数据库表里数据(千万级)重复的需要排除掉,把表数据查询出来用程序的方式判断去重效率很低,于是考虑用临时表。
先把新数据插入到临时表里,临时表结构和原始表一致。
用 SQL 的方式把不重复的数据 DataA 查询出来。
把 DataA 插入到原始表里。
因为不重复的数据我还要做一些其他的处理,所以查出来 DataA,若不需做特殊处理可直接使用 insert into select
的方式将第 2 步的数据插入到原始表,然后清空临时表
第 2 步有两种方式,一种是用 not exists
的方式,如
第二种方式是用 left join
经测试(每个人的表结构和索引各有不同,我这里仅仅提供参考)
临时表数据量少时, not exists
用时较少,随着数据量越多用时越久。当数据达到 10w 时,用时 25s。
临时表数据量少时,left join
用时 30s,随着数据量越多变化不大,当数据达到 10w 时,用时 40s。
结论 1:单表去重时,只要导入的数据量不是特别特别大(20w 级以上),优先使用 not exists 做去重。
但还有一种情况,就是需要对两个表做去重。
例如
这种情况下,临时表数据少时,not exists
用时较少,随着数据量越多用时越久。当数据达到 10w 时,用时 150s!!!。
临时表数据少时,left join
用时仍然是 30s,随着数据量越多用时越久。当数据达到 10w 时,用时仍然是 40s。
两者在数据量为 3w 时,用时不相上下
结论 2:双表去重时,当导入的数据在 3w 以下时,用 not exists,在 3w 以上时,用 left join。
文章转载自:救苦救难韩天尊
评论