前言
家喻户晓,数据库中INSERT INTO语法是append形式的插入,而最近在解决一些客户数据导入场景时,常常遇到须要笼罩式导入的状况,常见的笼罩式导入次要有上面两种:
1、局部笼罩:新老数据依据要害列值匹配,能匹配上则应用新数据笼罩,匹配不上则直接插入。
2、齐全笼罩:间接删除所有老数据,插入新数据。
本文次要介绍如何在数据库中实现笼罩式数据导入的办法。
局部笼罩
业务场景
某业务每天给业务表中导入大数据进行剖析,业务表中某列存在主键,当插入数据和已有数据存在主键抵触时,心愿可能对该行数据应用新数据笼罩或者说更新,而当新老数据userid不抵触的状况下,间接将新数据插入到数据库中。以将表src中的数据笼罩式导入业务表des中为例:
利用计划
计划一:应用DELETE+INSERT组合实现(UPDATE也能够,请读者思考)
--开启事务START TRANSACTION;--去除主键抵触数据DELETE FROM desUSING srcWHERE EXISTS (SELECT 1 FROM des WHERE des.userid = src.userid);--导入新数据INSERT INTO desSELECT *FROM srcWHERE NOT EXISTS (SELECT 1 FROM des WHERE des.userid = src.userid);--事务提交COMMIT;
计划长处:应用最常见的应用DELETE和INSERT即可实现。
计划毛病:1、分了DELETE和INSERT两个步骤,易用性欠缺;2、借助子查问识重,DELETE/INSERT性能受查问性能制约。
计划二:应用MERGE INTO性能实现
MERGE INTO des USING src ON (des.userid = src.userid)WHEN MATCHED THEN UPDATE SET des.b = src.bWHEN NOT MATCHED THEN INSERT VALUES (src.userid,src.b);
计划长处:MERGE INTO单SQL搞定,应用便捷,外部去重效率高。
计划毛病:须要数据库产品反对MERGE INTO性能,以后Oracle、GaussDB(DWS)等数据库已反对此性能,mysql的insert into on duplicate key也相似此性能。
齐全笼罩
业务场景
某业务每天给业务表中导入肯定工夫区间的数据进行剖析,剖析只须要导入工夫区间的去除,不须要以往历史数据,这种状况就须要应用到笼罩式导入。
利用计划
计划一:应用TRUNCATE+INSERT组合实现
--开启事务START TRANSACTION;--革除业务表数据TRUNCATE des;--插入1月份数据INSERT INTO des SELECT * FROM src WHERE time > '2020-01-01 00:00:00' AND time < '2020-02-01 00:00:00';--提交事务COMMIT;
计划长处:简略暴力,先清理在插入间接实现相似笼罩写性能。
计划毛病:TRUNCATE清理业务表des数据时对表加8级锁直到事务完结,在因数据量微小而INSERT工夫很长的状况下,des表在很长时间内是不可拜访的状态,业务表des相干的业务处于中断状态。
计划二:应用创立长期表过渡的形式实现
--开启事务START TRANSACTION;--创立长期表CREATE TABLE temp(LIKE desc INCLUDING ALL);--数据先导入到长期表中INSERT INTO temp SELECT * FROM src WHERE TIME > '2020-01-01 00:00:00' AND TIME < '2020-02-01 00:00:00';--导入实现后删除业务表desDROP TABLE des;--批改长期表名temp->desALTER TABLE temp RENAME TO des;--提交事务COMMIT;
计划长处:相比计划一,在INSERT期间,业务表des能够持续被拜访(老数据),即事务提交前剖析业务可持续拜访老数据,事务提交后剖析业务能够拜访新导入的数据。
计划毛病:1、组合步骤较多,不易用;2、DROP TABLE操作会删除表的依赖对象,例如视图等,前面依赖对象的还原可能会比较复杂。
计划三:应用INSERT OVERWRITE性能
INSERT OVERWRITE INTO des SELECT * FROM src WHERE time > '2020-01-01 00:00:00' AND time < '2020-02-01 00:00:00';
计划长处:单条SQL搞定,执行便捷,可能反对一键式切换业务查问的新老数据,业务不中断。
计划毛病:须要产品反对INSERT OVERWRITE性能,以后impala、GaussDB(DWS)等数据库均已反对此性能。
总结
随着大数据的场景越来越多,数据导入的场景也越来越丰盛,除了本文介绍的笼罩式数据导入,还有其余诸如疏忽抵触的INSERT IGNORE导入等等其余的导入形式,这些导入场景能够以应用根底的INSERT、UPDATE、DELETE、TRUNCATE来组合实现,然而也同样会对高级的一键SQL性能有间接诉求,前面有机会再持续介绍。
本文分享自华为云社区《数据库笼罩式数据导入办法介绍》,原文作者:along_2020 。
点击关注,第一工夫理解华为云陈腐技术~