0 0

如何高效实现批量插入数据,并去重0

现需要实现定期将项目A的数据同步到项目B中,从项目A提供了基于HTTP的接口获取数据,解析数据,并将解析到的数据批量插入到项目B的数据库中,但是有一个要求插入之前必须要判断当前数据是否存在,如果存在则不插入,有什么高效的方式实现。
2014年6月14日 17:15

11个答案 按时间排序 按投票排序

0 0

最近刚做了一个你说的类似需求:

我的业务需求是,
从oracle数据库中获取数据,然后同步到sqlserver中。

首先是配置两个数据库之间的连接设置。
我是sqlserver 连接oracle 配置sqlserver的链路服务器就OK。

下面是存储过程的内容了:

1. 创建临时表。

通过远程连接,insert into 临时表  select  远程表  。
获取数据先到本地,。

然后用 临时表的数据,跟你本地业务表的数据进行对比。
查询不通的数据。

-- (1) 远程读取NC需求计划,分组汇总数据后,插入到临时表 #tmp_pl_plan中。
	set @InsertStrSQL = @InsertStrSQL+ @tmpStrSQl;
	print(@InsertStrSQL) ;
	exec(@InsertStrSQL);
	
	select @tmpCont = count(1) from #tmp_pl_plan ;
	
	-- state:0新增、1修改、2删除
	-- (2) 用本地数据与临时表中的数据,进行对比,更新本地表中计划数量与临时表中不相等的记录.
	   
		update t set t.plnum  =	a.plnum	,t.state = 1
		from  #tmp_pl_plan a,NC_PL_PLAN t 
		where a.factorycode = t.factorycode and a.weldingdate = t.weldingdate
		and a.divisions = t.divisions and a.zzmadeline = t.zzmadeline 
		and a.zzweldingwayCode  = t.zzweldingwayCode and a.zzmadelinetypeCode = t.zzmadelinetypeCode
		and a.convertedcode = t.convertedcode and  a.ncfprocode = t.ncfprocode	
		and t.plnum != a.plnum	
		and t.weldingdate >=  @fbegdate and t.weldingdate <= @fenddate 
	
	-- (3) 对比数据,查找本地表中存在,但是临时表中不存在的记录,然后修改本地表中的数量=0 ,state = 3 表示删除
		update t set t.plnum = 0 ,t.state = 2  
		from NC_PL_PLAN t
		where t.weldingdate between  @fbegdate and @fenddate 
		and not exists (
			select 1 from  #tmp_pl_plan a where a.factorycode = t.factorycode and a.weldingdate = t.weldingdate
			and a.divisions = t.divisions and a.zzmadeline = t.zzmadeline 
			and a.zzweldingwayCode  = t.zzweldingwayCode and a.zzmadelinetypeCode = t.zzmadelinetypeCode
			and a.convertedcode = t.convertedcode  and a.ncfprocode = t.ncfprocode
			
		);

	
	-- (4) 对比数据,新增临时表中不存在于当前表的数据
	--delete	NC_PL_PLAN;
	insert into NC_PL_PLAN 
	select * from #tmp_pl_plan t
	where t.weldingdate between  @fbegdate and @fenddate 
	and not exists (
		select 1 from   NC_PL_PLAN a where a.factorycode = t.factorycode and a.weldingdate = t.weldingdate
		and a.divisions = t.divisions and a.zzmadeline = t.zzmadeline 
		and a.zzweldingwayCode  = t.zzweldingwayCode and a.zzmadelinetypeCode = t.zzmadelinetypeCode
		and a.convertedcode = t.convertedcode and a.ncfprocode = t.ncfprocode
		and a.weldingdate >=  @fbegdate and a.weldingdate<= @fenddate 
	)
	order by t.weldingdate desc ;


2014年9月18日 10:09
0 0

分2步骤做:
1.首先用关键字区建立2类记录,即已经存在的记录和不存在的记录;
2.对已经存在的记录进行一次批量的Update操作,不做数据的比对工作;
3.对不存在的记录进行一次批量的insert操作;

这个样的效率要高很多。至于你用什么做批量操作就要看你用的数据库了。

2014年7月25日 15:42
0 0

你可以试试开源的Kettle ETL抽取工具,很好用。设置数据源及源库和目标库
新建转换--加入输入--更新\插入操作。效率比较高

2014年7月21日 13:14
0 0

个人感觉,通过新建临时表,现将数据插入到临时表中,在通过sql中去重语句去掉重复的记录,然后在将临时表中的数据通过方式同步到另外的数据库中,这样相对安全和效率来说,还算可以。

2014年7月21日 10:57
0 0

从题主的描述来看:
1:定期同步 :说明数据实时性要求不高,只是周期性同步。
2:HTTP的接口获取数据 :用HTTP说明数据量不大。
不了解题主所说的高效指的什么:
两种可能:
高效开发,维护:即最小开发量,日后维护量也小。
高效同步数据:即数据快速同步。
    可选择的方案是:文件全量同步,ftp+shell脚本+sqlloader全是配置工作,开发量最小,好维护。同时sqlloader装载速度最快,全量同步,不用考虑数据一致性问题。

如果无法做全量同步,只能增量的话,就要考虑数据重复,及一致性问题。
比较好的方案是:先装载到临时表,然后库内做merge,update.

2014年7月17日 17:23
0 0

先全部插入临时表,然后insert into ...select... where...

2014年7月11日 12:38
0 0

1.merge into A
using B
on(条件)
。。。。
2.批处理

2014年6月16日 16:48
0 0

都是oracle的话 数据库链,存储最为快速。

2014年6月16日 15:01
0 0

数据库如果是Oracle,请采用存储过程进行。
存储过程应该采用SaveorUpdate的形式。

即记录先Update,根据Update结果,决定Insert数量

以上

2014年6月15日 22:33
0 0

数据库插入数据的话,不同的数据库产品不是有对应的操作原语吗,比如update *** if exist,insert *** if exist之类的。

2014年6月15日 12:52
0 0

用存储过程可以吗?

2014年6月14日 21:50

相关推荐

    ThinkPHP 批量添加数据

    3. **批量插入**:ThinkPHP提供了`insertAll()`方法用于批量插入数据。这个方法接收一个包含多条记录的数组,并一次性插入数据库。示例如下: ```php $result = $userModel-&gt;insertAll($data); ``` 这里的`$...

    java数据批量处理

    2. ORM框架:Hibernate、MyBatis等ORM框架提供了批量插入、更新、删除的功能,简化数据库操作。 3. NoSQL存储:MongoDB、Cassandra等NoSQL数据库也支持批量操作,适用于非结构化或半结构化数据。 四、性能优化 1....

    针对Sqlserver大数据量插入速度慢或丢失数据的解决方法

    为提高插入速度,可以使用批量插入,即将多条数据组合成一个批次一起插入。例如,可以创建一个存储过程,接收一个包含所有数据的表变量,然后一次性插入到目标表。 2. **使用BULK INSERT命令**: SQL Server提供了...

    PPC大批量数据导入数据库SQLite

    3. 批量导入策略:批量导入数据时,有多种方法可以提高效率,如分块导入(将大文件拆分为小块,逐块导入)、使用事务(确保所有数据要么全部导入,要么都不导入)、预处理数据(清理、格式化、去重等)。 4. 防重复...

    爬取数据并存储到mysql

    - 数据去重:在插入数据前,检查是否已存在相同的记录,避免重复插入。 总结来说,从爬取数据到存储到MySQL数据库,涉及Python爬虫技术、HTML解析、数据库操作以及网络请求等多个方面。掌握这些技能,能让我们有效...

    mysql-WINDOWS--SERVICES.zip_HTTP_HTTP协议_MYSQL_数据采集_采集

    数据导入可以使用INSERT INTO语句,或者在大量数据情况下,考虑使用LOAD DATA INFILE语句,它能快速高效地批量插入数据。 在Windows服务程序中配置MySQL,可以使用MySQL的安装程序或“服务”管理工具。设置MySQL为...

    一个批量导入数据库的工具

    为了提高效率,工具可能采用批量插入的方式,减少与数据库的交互次数。 5. **错误处理**:在导入过程中,可能会遇到数据格式错误、约束冲突等问题。批量导入工具会记录这些错误,允许你查看并修复后再尝试导入,而...

    bloomfilter-project:去重功能,服务化,启动服务端,在客户端就以单一或批量去重

    【标题】中的“bloomfilter-project”是一个基于布隆过滤器(Bloom Filter)实现的去重服务项目,它提供了一种服务化的解决方案,允许在客户端进行单个或批量数据的去重操作。 【描述】进一步说明了这个项目的核心...

    mysql 10w级别的mysql数据插入

    LOAD DATA INFILE可以直接从文件中读取数据并快速插入,而bulk_insert_buffer_size可以缓存批量插入的数据,减少磁盘I/O。 7. **索引策略**: 插入大量数据时,如果表有索引,那么插入速度会受到一定影响,因为...

    将MySQL去重操作优化到极致的操作方法

    3. **使用临时表**:如果数据量非常大,还可以考虑先将去重后的数据存入临时表,然后再批量插入目标表,以减少频繁的磁盘I/O操作。步骤如下: - 创建临时表:`CREATE TEMPORARY TABLE temp_target LIKE t_source;` ...

    文本去重复

    - 文本去重软件"文本去重.exe"可能是基于上述的一种或多种方法实现的,它可能提供了图形用户界面,方便用户上传文件、设置参数,并显示去重结果。 - 软件可能支持批量处理,对大量文本文件进行快速去重,提高工作...

    Test_GSZ_ODBC版本2022019_145可以做到3S写入10万行数据

    标题中的“Test_GSZ_ODBC版本2022019_145可以做到3S写入10万行数据”表明这是一个测试项目,使用了特定版本的GSZ ODBC驱动程序,能够实现高效的数据导入性能。在描述中提到了在Windows 10专业版操作系统上,利用ODBC...

    算法与数据结构(Python),源代码

    此外,"04 3.4 批量数据表示与操作.pptx"、"12 第五章 输入输出处理(下).pptx"、"10 11第六章 函数与模块.pptx"和"07 第二章 算法概述(下).pptx"分别涉及批量数据处理、输入输出操作、函数与模块的使用,这些都是...

    DataTable 快速导入数据库——百万条数据只需几秒

    本文将详细介绍如何利用`DataTable`与`SqlBulkCopy`类实现快速的数据批量导入,使百万条数据的导入时间缩短至几秒内。 #### `DataTable`简介 `DataTable`是.NET Framework中用于存储和操作数据的一种结构,它类似...

    将excel导入sql2000

    6. **批量插入**:如果数据量非常大,可以考虑编写T-SQL脚本进行批量插入,以提高效率。但这需要对SQL语句有一定了解。 7. **定时导入**:为了定期更新数据库,可以设置计划任务或使用SSIS包来自动化这个过程。 8....

    Etl工具-kettle-spoon

    Kettle Spoon支持多种加载策略,包括批量插入、分批插入、实时流式加载等。同时,它还能处理并发和错误处理,确保数据准确无误地导入到目标系统。 ### 工作流与作业 Kettle Spoon中的工作流(Job)和转换...

    Python + MongoDB 开发的百度云资源爬虫.zip

    为了提高效率和确保数据一致性,可以使用批量插入操作,并考虑数据去重策略。 此外,为了确保爬虫的稳定性和持久性,通常会实现错误处理机制,如try-except语句捕获异常,以及使用logging模块记录爬虫运行日志。...

    大型软件公司.net面试题!一定得看(附答案

    8. 大量数据插入错误:数据库报错可能是由于事务过大导致的,可以使用批量插入、分批插入或事务控制来避免。另外,优化SQL语句、索引设计和硬件配置也能有效提高插入效率。 9. 数据去重算法:对于具有主键和外键...

    最全的ETL资料

    Kettle支持多种加载方式,如直接插入、批量插入、更新或删除等,并且可以处理大量数据的高效加载。 4. **Kettle工具**:Kettle是一种Java编写的企业级ETL工具,其特点在于强大的数据处理能力、灵活的插件机制以及...

    ETL若干关键技术研究

    这涉及到空值处理、异常值检测、重复数据去重等操作。 3. **数据转换(Transform)**:数据转换是将抽取的数据转换为适合目标系统格式的过程。这可能包括数据类型转换、数据规约(如聚合、分组)、数据标准化、数据...

Global site tag (gtag.js) - Google Analytics