多线程BulkCopy批量添加数据到不同表

问题描述

各位好我开两个线程一次持续往同一个数据库表1表2中导入20000条数据大约500MS表1和2都能导入成功一次现在我开10个线程往表1/表2......表10中各导入两万条数据发现耗时为500MS到5000MS之间求优化的方法我用的是sqlserver数据库哦

解决方案

解决方案二:
不是开越多就越快,数据库有IO瓶颈限制的所以要么你分库,即将表分拆到不同的数据库里,否则就减少线程
解决方案三:
引用1楼starfd的回复:

不是开越多就越快,数据库有IO瓶颈限制的所以要么你分库,即将表分拆到不同的数据库里,否则就减少线程

分库实在没办法肯定要这么做的但因为数据还需要分析展示等原因所以不是优先方案
解决方案四:
速度不是很正常吗?500MS到5000MS之间500MS时是10个线程同时在工作5000MS是只有一个线程在工作都属于极端情况由于你并不能控制线程在何时开始工作,所以并没有优化的可能
解决方案五:
引用3楼xuzuning的回复:

速度不是很正常吗?500MS到5000MS之间500MS时是10个线程同时在工作5000MS是只有一个线程在工作都属于极端情况由于你并不能控制线程在何时开始工作,所以并没有优化的可能

不正常我监控了一个线程发现执行bulkCopy.WriteToServer这个函数执行了5秒sqlserver支持并行操作怎么会一个线程导入数据库500MS10个线程就要5000MS呢?
解决方案六:
由于某种原因,这10个线程不是并行执行,而是串行执行的于是就1个表500ms,10个表5000ms
解决方案七:
引用5楼xuzuning的回复:

由于某种原因,这10个线程不是并行执行,而是串行执行的于是就1个表500ms,10个表5000ms

这个不科学其实9个线程也能达到1S10个线程效率就极为低下了最长要五六秒
解决方案八:
引用6楼Q1092926267的回复:

Quote: 引用5楼xuzuning的回复:
由于某种原因,这10个线程不是并行执行,而是串行执行的于是就1个表500ms,10个表5000ms

这个不科学其实9个线程也能达到1S10个线程效率就极为低下了最长要五六秒

应该是某一方面达到了瓶颈IO写入3M/s应该不至于
解决方案九:
你是不能控制线程的运行的,他由操作系统调度线程的工作方式是见缝插针,如果没有缝隙,那就停下来等待直到.Net4才有利用多核CPU的平行处理出现Parallel.For-for循环的并行运算Parallel.ForEach-foreach循环的并行运算Parallel.Invoke-并行调用多个任务Task-任务,基于线程池。其使我们对并行编程变得更简单,且不用关心底层是怎么实现的PLINQ-用于对内存中的数据做并行运算,也就是说其只支持LINQtoObject的并行运算不知道你那BulkCopy是用何种方式写的即便如此,那也要看你的机器有几个核可用你说其实9个线程也能达到1S10个线程效率就极为低下了这就是说10个线程时,机器已经不堪重负了,那第10个线程就是压死骆驼的那根稻草既然如此,那你的优化方案不是已经有了吗?
解决方案十:
引用8楼xuzuning的回复:

你是不能控制线程的运行的,他由操作系统调度线程的工作方式是见缝插针,如果没有缝隙,那就停下来等待直到.Net4才有利用多核CPU的平行处理出现Parallel.For-for循环的并行运算Parallel.ForEach-foreach循环的并行运算Parallel.Invoke-并行调用多个任务Task-任务,基于线程池。其使我们对并行编程变得更简单,且不用关心底层是怎么实现的PLINQ-用于对内存中的数据做并行运算,也就是说其只支持LINQtoObject的并行运算不知道你那BulkCopy是用何种方式写的即便如此,那也要看你的机器有几个核可用你说其实9个线程也能达到1S10个线程效率就极为低下了这就是说10个线程时,机器已经不堪重负了,那第10个线程就是压死骆驼的那根稻草既然如此,那你的优化方案不是已经有了吗?

不会是CPU的瓶颈我输出了时间在写入数据库时耗时最长bulkCopy.WriteToServer(sourceDt.Select());具体的代码如下if(targetTable=="StateLogInfo1")Console.WriteLine("2.1"+DateTime.Now.ToString("ss.fff"));SqlConnectionconn=newSqlConnection(strConn);SqlBulkCopybulkCopy=newSqlBulkCopy(conn);//用其它源的数据有效批量加载sqlserver表中bulkCopy.DestinationTableName=targetTable;//服务器上目标表的名称bulkCopy.BatchSize=sourceDt.Rows.Count;//每一批次中的行数try{conn.Open();if(targetTable=="StateLogInfo1")Console.WriteLine("2.2"+DateTime.Now.ToString("ss.fff"));if(sourceDt!=null&&sourceDt.Rows.Count!=0)bulkCopy.WriteToServer(sourceDt.Select());//将提供的数据源中的所有行复制到目标表中if(targetTable=="StateLogInfo1")Console.WriteLine("2.3"+DateTime.Now.ToString("ss.fff"));}catch(Exceptionex){Console.WriteLine(ex.ToString());returnfalse;}finally{conn.Close();conn.Dispose();if(bulkCopy!=null)bulkCopy.Close();}returntrue;

解决方案十一:
你可以请sp1234帮你诊断一下
解决方案十二:
是不是数据库服务器io瓶颈?可以10个线程对应10个库,做下测试,看下耗时多少
解决方案十三:
引用11楼lovelj2012的回复:

是不是数据库服务器io瓶颈?可以10个线程对应10个库,做下测试,看下耗时多少

测试过了ASYNC_NETWORK_IOwaittime最长

时间: 2024-09-22 22:18:17

多线程BulkCopy批量添加数据到不同表的相关文章

如何在gridview中批量添加数据

问题描述 如何在gridview中批量添加数据 我想在dev gridview 中批量添加数据,如何在gridview中批量添加数据,并保存数据库中 解决方案 向数据库批量添加数据JDBC--批量添加数据C#批量添加数据 解决方案二: 希望我的回复对你有用. 假定有一个Product表,字段有(Id,Name,Quantity,...)我们要一次批量更新Quantity的值 首先在Gridview中,Quantity列以TemplateField显示,其他的列属性设为只读,把显示格式设为Text

php批量添加数据与批量更新数据的实现方法_php技巧

本文实例讲述了php批量添加数据与批量更新数据的实现方法.分享给大家供大家参考.具体分析如下: php如果要批量保存数据我们只要使用sql的insert into语句就可能实现数据批量保存了,如果是更新数据使用update set就可以完成更新了,操作方法都非常的简单,下面整理两个例子. 批量数据录入 设计方法:同时提交多条表单记录,为每一条记录设置相同的文本域名称,然后在表单处理页中,通过for循环来读取提取表单提交的数据,最后以数据的形式将数据逐条添加到数据库中. 其中,应用一个count(

Yii2如何批量添加数据_php实例

批量添加这个操作,在实际开发中经常用得到,今天小编抽空给大家整理些有关yii2批量添加的问题,感兴趣的朋友一起看看吧. 在上篇文章给大家介绍了关于浅析Yii2 gridview实现批量删除教程,当然,着重点在于怎么去操作gridview了,今儿我们来好好谈谈yii2如何批量添加数据? 有同学嚷嚷了,这还不简单,我foreach一循环,每个循环里面直接把数据插入到数据库,简单粗暴完事!我擦嘞,哥,你要是跟我在一个公司,我觉得第二天见到你的概率可就不大了! 话不多说,说多了你在骂我,我们步入正题,先

mysql使用mybatis批量添加数据,返回主键

问题描述 mysql使用mybatis批量添加数据,返回主键 mysql使用mybatis批量添加,使用各种方法都无法返回对应的主键,请兄弟们不吝赐教 解决方案 该功能无法实现,只能分步骤来,先插入在查询 解决方案二: 批量添加还要返回主键??这个不太可能吧.最多也就返回插入的条数.如果返回主键,那不是了返回一个list然后里面放主键?一条一条插入倒是可以返回主键 解决方案三: 分步骤来,先插入在查询

c#这段代码向数据库批量添加数据为何1000行就需要10分钟啊求大神帮忙优化啊

问题描述 c#这段代码向数据库批量添加数据为何1000行就需要10分钟啊求大神帮忙优化啊 public void ShuaXin() { SqlCommand com = new SqlCommand(""delete from priceavg"" DBHelper.con); DBHelper.con.Open(); com.ExecuteNonQuery(); adapter = new SqlDataAdapter(""select *

怎么用datagridview批量添加数据哦 谢谢,第一次用wingdows编程, 请指点指点哦,

问题描述 我想用datagridview批量添加数据进数据库,能给个例子吗.指点指点吗?感激············· 解决方案 解决方案二:dataGridView1.DataSource=ds.Tables[0];

在ASP.NET 2.0中操作数据之六十四:GridView批量添加数据_自学过程

导言: 在前面的第62章<GridView批量更新数据>里,我们用GridView控件里定制了一个批编辑界面,同样的我们也可以定制一个批添加界面.假设有这种情况,我们接受一批从Tokyo(东京)发过来的货物:6种不同的tea 和 coffee,如果用户在一个DetailsView控件里一次输入一个产品,他将会重复的输入很多相同的值,比如相同的种类(Beverages),相同的供应商(Tokyo Traders),相同的discontinued值(False),以及相同的order值(0).重复

php批量添加数据与批量更新数据方法

批量数据录入 设计方法:同时提交多条表单记录,为每一条记录设置相同的文本域名称,然后在表单处理页中,通过for 循环来读取提取表单提交的数据,最后以数据的形式将数据逐条添加到数据库中. 其中,应用一个count()函数来获取数组中元素的个数. int count(mixed var); 表单提交页面  代码如下 复制代码 <form name="form1" method="post" action="index_ok.php"> &

java批量添加数据,数据库中出现数据无序问题

问题描述 描述:通过Excel导入数据,解析后放入list集合中,集合中数据的顺序和excel导入时的一致,通过批量添加到数据库中,出现的结果是数据库中的数据是无序的(也就是和excel导入时的顺序不一致).求解... 问题补充:xianshi_cn 写道 解决方案 I have met the same issue before in Oracle, but I also don't know how come the the physics orders of data changed wh