首页 > 其他分享 >10W数据量导入与现有表数据去重

10W数据量导入与现有表数据去重

时间:2024-08-16 17:48:40浏览次数:9  
标签:t2 columnA columnB 用时 导入 数据量 t1 10W

使用的是PostgreSQL

在做大数据量(十万级)导入时,某些字段和数据库表里数据(千万级)重复的需要排除掉,把表数据查询出来用程序的方式判断去重效率很低,于是考虑用临时表。

  1. 先把新数据插入到临时表里,临时表结构和原始表一致。
  2. 用SQL的方式把不重复的数据DataA查询出来。
  3. 把DataA插入到原始表里。

因为不重复的数据我还要做一些其他的处理,所以查出来DataA,若不需做特殊处理可直接使用 insert into select 的方式将第2步的数据插入到原始表,然后清空临时表

第2步有两种方式,一种是用 not exists 的方式,如

SELECT
	* 
FROM
	tableTemp t1 
WHERE
	NOT EXISTS ( SELECT 1 FROM tableName WHERE columnA = t1.columnA AND columnB = t1.columnB )

第二种方式是用 left join

SELECT
	* 
FROM
	tableTemp t1
	LEFT JOIN tableName t2 ON t2.columnA = t1.columnA AND t2.columnB = t2.columnB 
WHERE
	t2.columnA IS NULL

经测试(每个人的表结构和索引各有不同,我这里仅仅提供参考)

临时表数据量少时, not exists 用时较少,随着数据量越多用时越久。当数据达到10w时,用时25s。

临时表数据量少时,left join 用时30s,随着数据量越多变化不大,当数据达到10w时,用时40s。

结论1:单表去重时,只要导入的数据量不是特别特别大(20w级以上),优先使用 not exists 做去重。

但还有一种情况,就是需要对两个表做去重。

例如

SELECT
	* 
FROM
	tableTemp t1 
WHERE
	NOT EXISTS ( 
	SELECT 1 FROM tableNameA WHERE columnA = t1.columnA AND columnB = t1.columnB 
	union all
	select 1 from tableNameB WHERE columnA = t1.columnA AND columnB = t1.columnB 
	);

SELECT
	* 
FROM
	tableTemp t1
	LEFT JOIN tableNameA t2 ON t2.columnA = t1.columnA AND t2.columnB = t1.columnB 
	LEFT JOIN tableNameB t3 ON t3.columnA = t1.columnA AND t3.columnB = t1.columnB 
WHERE
	t2.columnA IS NULL
	AND t3.columnA IS NULL

这种情况下,

临时表数据少时,not exists 用时较少,随着数据量越多用时越久。当数据达到10w时,用时150s!!!。

临时表数据少时,left join 用时仍然是30s,随着数据量越多用时越久。当数据达到10w时,用时仍然是40s。

两者在数据量为3w时,用时不相上下

结论2:双表去重时,当导入的数据在3w以下时,用 not exists,在3w以上时,用 left join。

标签:t2,columnA,columnB,用时,导入,数据量,t1,10W
From: https://www.cnblogs.com/GilbertDu/p/18363389

相关文章

  • PLSQL导入/导出数据方法
    https://blog.csdn.net/zhouleiblog/article/details/8893005以下为借用以上信息:PLSQL导入/导出数据方法PLSQL导入/导出数据方法以前导数据库信息的时候,总是会先开启sql窗口,把自己手写的建表文件复制进去,然后再导入数据信息。今天突然懒得去找以前的建表文件,而想用SLSQL直接从......
  • Vue3+Vite项目从零搭建+安装依赖+配置按需导入
    环境准备Vscode/HBuilder等任何一种前端开发工具node.js&npm本地开发环境源代码管理:Git技术栈项目构建创建项目npmcreatevite依次运行最后三行出现,成功启动项目在浏览器输入http://localhost:5173/可以显示页面src别名的配置在开发项目的时候文件与文件......
  • 虚幻5数字人,如何将MetaHuman的光照导入到自己的UE项目中
    本质上就是将metahuman光照的地图导入到自己的ue5项目中1.创建MetaHuman光照项目首先在EpicGames虚幻商城中搜索”Metahuman光照“ 点击免费加入到库在自己的库中找到MetaHuman点击创建工程 在这里可以选择你项目位置和引擎版本和你现在的项目版本一样就好等待......
  • 宝塔如何数据库的备份与导入
    点击备份按钮(无备份),(如图)选择备份,即可备份当前数据库文件。点击导入按钮,(如图)可以选择本地上传,或选择已备份的文件还原。默认数据库路径为/www/backup/database。以上备份导入均是使用mysqldump。导入的sql文件格式必须符合标准,若你使用phpmyadmin导出的sql文件,可能会缺少版......
  • maven仓库下载不下来的包如何自己安装(本地宝导入到maven仓库)
    1.下载jar包https://mvnrepository.com/在官网上搜索jar包,点击下载2.将jar包放在一个没有中文的路径下(我放在了D盘根路径下)打开CMD框执行下面的命令mvninstall:install-file-Dfile=D:\kingbase8-8.6.0.jar-DgroupId=com.kingbase-DartifactId=kingbase8-Dversion=8......
  • GreatSQL 并行Load Data加快数据导入
    GreatSQL并行LoadData加快数据导入数据库信息数据库版本:GreatSQL8.0.32-25Clickhouse表需要导入到GreatSQL中,表数据量庞大所以选用导出CSV的方式。测试数据复现操作loaddataMySQLloaddata语句能快速将一个文本文件的内容导入到对应的数据库表中(一般文本的一行对应......
  • tensorboard_logger库无法导入的问题解决
    一、问题描述最近在学习深度学习时,从大神们那里copy的代码中有用到tensorboard_logger这个库的东西,所以很自然地就用condainstall或者pip去安装它,但是结果是:python开源库里面没有这东西。这就让我很苦恼,所以只能自己动手,丰衣足食了。 二、解决方法首先找到tensorboard_logge......
  • 【1.0版】【MYSQL安全】导入导出相关操作
    主题导入导出相关操作一、load_file()二、intooutfile一、load_file()load_file(file_name):读取文件并返回该文件的内容作为一个字符串使用条件:A、必须有权限读取并且文件必须完全可读and(selectcount()frommysql.user)>0#如果结果返回正常,说明具有读写......
  • mysql load data file 批量导入数据
    mysql大量数据导入记录工作需要将大量数据导入到mysql中,但是数据量很大且几十个文本数据,每次导入的数据量有限制,所以需要分批导入。为了快速导入记录下使用loaddatainfile方式。1.SQL入数据语句先将数据传入/var/lib/mysql/test/路径mysql>loaddatainfile"/var/li......
  • MYSQL导出数据和导入数据命令
    MYSQL导出数据和导入数据命令网上也很多,我还是记录一下在我的博客里面,自己好查看MYSQL导出数据命令1.导出整个数据库mysqldump-u用户名-h数据库IP地址-p密码数据库名>备份的名称.sql测试账号如下:数据库名:web_user数据库IP:192.168.8.110用户名:root密码:root导出整......