问题描述
各位好我开两个线程一次持续往同一个数据库表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最长