问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

SQL批量插入数据几种方案的性能详细对比

发布网友 发布时间:2022-04-30 00:21

我来回答

2个回答

懂视网 时间:2022-04-30 04:43

public class DataInertTest 2 { 3 /// <summary> 4 /// 循环插入 5 /// </summary> 6 /// <returns>执行时间(秒)</returns> 7 public double LoopInsert(int count) 8 { 9 StringBuilder sql = new StringBuilder(); 10 for (int i = 0; i < count; i++) 11 { 12 sql.Append(" Insert into TQRCode(Name,Remark) values(‘这是第").Append(i).Append("条数据‘,‘这是第").Append(i).Append("条数据_remark‘) "); 13 } 14 //时间统计 15 var stopwatch = new Stopwatch(); 16 stopwatch.Start(); 17 new Helper().Excute(sql.ToString()); 18 return stopwatch.Elapsed.TotalMilliseconds; 19 } 20 21 /// <summary> 22 /// 批量插入 23 /// </summary> 24 /// <returns>执行时间(秒)</returns> 25 public double BatchInsert(int count) 26 { 27 StringBuilder sql = new StringBuilder(); 28 sql.Append(" Insert into TQRCode(Name,Remark) values "); 29 for (int i = 0; i < count; i++) 30 { 31 32 sql.Append(" (‘这是第").Append(i).Append("条数据‘,‘这是第").Append(i).Append("条数据_remark‘) "); 33 if (i % 500 == 0) 34 { 35 sql.Append(" Insert into TQRCode(Name,Remark) values "); 36 } 37 else if (i < count - 1) 38 { 39 sql.Append(","); 40 } 41 } 42 43 //时间统计 44 var stopwatch = new Stopwatch(); 45 stopwatch.Start(); 46 new Helper().Excute(sql.ToString()); 47 return stopwatch.Elapsed.TotalMilliseconds; 48 } 49 } C#实现代码

  注:sqlserver中单次批量插入数据最多1000条否则会提示我们:The number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values.  

 

 测试代码:

技术分享
 1 class Program
 2  {
 3  static void Main(string[] args)
 4  {
 5  for (int i = 0; i < 3; i++)
 6   {
 7   var obj = new DataInertTest();
 8   var t1 = obj.LoopInsert(100000);
 9   var t2 = obj.BatchInsert(100000);
10 
11   Console.WriteLine("LoopInsert : {0}", t1);
12   Console.WriteLine("BatchInsert : {0}", t2);
13   Console.WriteLine("--------------------------------------------------");
14  
15   } 
16   Console.ReadLine();
17  } 
18 }
测试代码

  

  测试结果:

技术分享

   执行了3次结果很明显,效率差距在10倍以上。批量插入的方式之所以比循环插入快,主要因为sqlserver中每个insert into 都是一个独立的事务,循环插入500条数据就是500个事务,而一次插入500条数据,就只有一个事务。事务减少了消耗自然也就小了。且频繁的事务提交相当影响数据库的性能,也就起到了影响整个系统性能的作用(嘿嘿,一不小心也许服务器就挂了)。

  需要注意的是,测试中因为数据量不大所以两种方式都是采用的一次入库的方式,这样做可以减少数据库连接次数。但是这样做有个很大的弊端:内存消耗会很大。10w数据的sql拼接还好,如果是100w行那就未必了。所以,如果单条数据较大,建议每几百或几千行的时候提交一次,这个数字具体多大需要量体裁衣,平衡内存消耗。

   

 

SqlServer数据插入性能小记

标签:

热心网友 时间:2022-04-30 01:51

  技术方案一:

  压缩时间下程序员写出的第一个版本,仅仅为了完成任务,没有从程序上做任何优化,实现方式是利用数据库访问类调用存储过程,利用循环逐条插入。很明显,这种方式效率并不高,于是有了前面的两位同事讨论效率低的问题。

  技术方案二:

  由于是考虑到大数据量的批量插入,于是我想到了ADO.NET2.0的一个新的特性:SqlBulkCopy。有关这个的性能,很早之前我是亲自做过性能测试的,效率非常高。这也是我向公司同事推荐的技术方案。

  技术方案三:

  利用SQLServer2008的新特性--表值参数(Table-Valued Parameter)。表值参数是SQLServer2008才有的一个新特性,使用这个新特性,我们可以把一个表类型作为参数传递到函数或存储过程里。不过,它也有一个特点:表值参数在插入数目少于 1000 的行时具有很好的执行性能。

  技术方案四:

  对于单列字段,可以把要插入的数据进行字符串拼接,最后再在存储过程中拆分成数组,然后逐条插入。查了一下存储过程中参数的字符串的最大长度,然后除以字段的长度,算出一个值,很明显是可以满足要求的,只是这种方式跟第一种方式比起来,似乎没什么提高,因为原理都是一样的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
潍坊哪里有卖有影像的游戏王决斗盘 游戏王决斗盘哪卖? 中国有卖〔游戏王〕动画片中的战斗盘的吗?如果有,安徽哪有卖的? ___有两个端点,___只有一个端点,___没有端点 线段线段有两个端点,射线射线只有一个端点,直线直线没有端点._百度知 ... 监理费,设计费,勘探费,咨询费可否计入固定资产单 工程设计计入什么科目 求爱情语录 像送心爱的人回家 哪都顺路这种超经典超浪漫超温馨的_百度... 内眼角起疱是怎么回事 新绝代双骄之鱼戏江湖 怎么玩不了? 求解 合肥离婚后多久能买房 离婚后多长时间能买房 离婚要多久时间后可以买房 请问有人知道beautyleg Sara全套10部高清侧录*中的hd003 sara的背景音乐吗? www.BEAUTYLEG.com的会员帐号谁有? beautyleg no.964 是哪个模特 - 信息提示 beautyleg perri有几期 Beautyleg 一模特的名字http:&#47;&#47;image.baidu.com&#47;i?ct=503316480&z=&tn=baiduimagedetail&word=Beautyleg&i beautyleg. abby的中文名字 TcL手机看爱奇艺只有声音没有图像怎么处理 爱奇艺手机视频只有声音没有画面 微微一笑很倾城的男主叫什么? 类似【微微一笑很倾城】里面男主人性格的男主,不要虐的 ,只要告诉我名字就行。 网游小说,女主是大神,很漂亮,男主也是大神,很帅,有点类似微微一笑很倾城和天上红绯,最好是有玩家见 求校园文,类似微微一笑很倾城的,男主是大神,不虐甜文,可以不是网游小说,女主漂亮不傻白甜,谢啦 电影版微微一笑很倾城男主是杨洋吗 我的手机看爱奇艺有声音无画面 女主的网游小说(男主是大神,要帅,类似于《微微一笑很倾城》) 小说主人公叫林薇薇的小说 房款280万元,首付5成,贷款30年,月供多少? win10开机用户都没了怎么办,显示其它用户,输用户名和密码进不了系统 贷款280万,贷30年,每月要还多少? win10开机没有用户名和密码怎么办 在银行贷款270万,贷30年,利息5.05,每月供多少? 王者荣耀在哪里看朋友的对战 怎么不显示win10开机用户名 win7改win10开机显示用户名不存在怎么办 win10系统笔记本开机后没有显示用户名和密码输入框,也打不开bios重装不了系统什么原因? win10怎么取消开机显示的用户名和密码 Win10专业版怎么设置才能让它不显示我的微软账号啊 请问如何办理亚航登机手续? 关良油画价值如何?家里有一幅作品油画,请教老师们。 亚洲航空 登机手续问题国际航班 win10为什么改了用户名没法显示 南艺国画的任课老师的详细资料 在深圳宝安机场乘坐亚航到吉隆坡,求问详细值机流程 我重装的win10开机需要登录显示其他用户我没有用户名密码 重启的话就 哪位朋友知道在亚航官网上订票后,去咸阳国际机场怎么办理登机手续? 目前几位名家的老师,谁知道是谁。 吴冠中,范增,黄永玉,何家英,他们的老师是谁呢…