SqlServer数据插入性能小记
对于SQL性能,已经很久没关注了。由于近期项目既没有几千万的海量数据也没有过多的性能要求,所以在性能上也就没下太多功夫。然而,前不久和朋友闲谈间话题一转就说到程序上了,他说他用Delphi做了个数据导入的功能,插入数据的时候感觉很慢。以个人对SQL的了解,就建议他使用批量插入的方式,并很认真的告诉他这样应该会快很多。而在实际工作中,类似批量导入数据的功能是非常常见的,也许一个不小心我们就搞挂了服务器。那就究竟要怎么做才能给服务器留条活路,让用户不用点完上传看部电影再看上传结果呢?为此做了个小实验,并简单说下自己的看法。
环境:
CPU : i7;
内存 : 6G;
数据库:SqlServer2008;
数据量:10W
实验内容:
创建LoopInsert 和BatchInsert两个函数,LoopInsert中使用拼接的方式生成insert into xxx values(...) insert into xxx values(...) ...形式的sql执行并返回sql的执行时间,BatchInsert中同样使用拼接sql的方式生成insert into xxx values(...),(...),(...)形似的sql并返回sql的执行时间。利用控制台程序多次执行两个函数,并输出执行结果。
表结构:
CREATE TABLE TQRCode
(
ID INT PRIMARY KEY IDENTITY(1, 1) ,
Name NVARCHAR(300) ,
Remark NVARCHAR(300)
)
C#实现代码:
1 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数据插入性能小记的更多相关文章
- 大数据应用之HBase数据插入性能优化实测教程
引言: 大家在使用HBase的过程中,总是面临性能优化的问题,本文从HBase客户端参数设置的角度,研究HBase客户端数据批量插入性能优化的问题.事实胜于雄辩,数据比理论更有说服力,基于此,作者设计 ...
- "Entity Framework数据插入性能追踪"读后总结
园友莱布尼茨写了一篇<Entity Framework数据插入性能追踪>的文章,我感觉不错,至少他提出了问题,写了出来,引起了大家的讨论,这就是一个氛围.读完文章+评论,于是我自己也写了个 ...
- python 读取SQLServer数据插入到MongoDB数据库中
# -*- coding: utf-8 -*-import pyodbcimport osimport csvimport pymongofrom pymongo import ASCENDING, ...
- .NET批量大数据插入性能分析及比较
数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5. 使用DataAda ...
- 大数据应用之HBase数据插入性能优化之多线程并行插入测试案例
一.引言: 上篇文章提起关于HBase插入性能优化设计到的五个参数,从参数配置的角度给大家提供了一个性能测试环境的实验代码.根据网友的反馈,基于单线程的模式实现的数据插入毕竟有限.通过个人实测,在我的 ...
- .NET 百万级 大数据插入、更新 ,支持多种数据库
功能介绍 (需要版本5.0.44) 大数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现 当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API 操作数据库 ...
- c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比
c# 国内外ORM 框架 dapper efcore sqlsugar freesql hisql sqlserver数据常规插入测试性能对比对比 在6.22 号发布了 c# sqlsugar,his ...
- SQLServer 批量插入数据的两种方法
SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...
- 一次EF批量插入多表数据的性能优化经历
距离上次的博客已经有15个多月了,感慨有些事情还是需要坚持,一旦停下来很有可能就会停很久或者从此再也不会坚持.但我个人一直还坚持认为属于技术狂热份子,且喜欢精益求精的那种.最近遇到两个和数据迁移相关的 ...
- SQL从入门到基础–03 SQLServer基础1(主键选择、数据插入、数据更新)
一.SQL语句入门 1. SQL语句是和DBMS“交谈”专用的语句,不同DBMS都认SQL语法. 2. SQL语句中字符串用单引号. 3. SQL语句中,对于SQL关键字大小写不敏感,对于字符串值大小 ...
随机推荐
- Linux设置显示中文和设置字体
设置中文 一.查看当前使用的系统语言 1.登陆linux系统打开操作终端之后,输入 echo $LANG可以查看当前使用的系统语言.如 echo $LANG 2.查看安装的语言包 查看是否有中文语言包 ...
- 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现九
一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...
- ARC143E Reversi
ARC143E Reversi 简单的分析题. 思路 如果分析一个节点状态,那么时不方便的.但可以注意到,状态的改变好相连的边数有关. 从叶子节点开始考虑. 白色:在父亲翻转前选中,并改变父亲状态. ...
- viper读取配置文件
//方法一 func readConfig1(path, filename, filetype string) interface{} { viper.AddConfigPath(path) vipe ...
- select2的搜索框不能输入内容
select2的搜索框不能输入内容 原因:原来是模态对话框强制使自己处于焦点状态,导致select2的搜索框无法获取焦点所致. 解决办法:在初始化中重写模态对话框的enforceFocus函数 $.f ...
- Java 10大优点—Part4—Java内存模型
本文由 ImportNew - 靳禹 翻译自 zeroturnaround.如需转载本文,请先参见文章末尾处的转载要求. 在忙着参加在爱沙尼亚进行的 TEDx talk 演讲活动以及在比利时举办的一届 ...
- 对于web性能优化我有话说!
web性能是什么呢? 简单来说就是咱们的项目打开的快不快,举以下几个例子 表单提交 列表切换 动画的流程性 打开速度 MDN上对web性能的定义则是Web性能是网站或应用程序的客观度量和可感知的用户体 ...
- 用人工智能模型预测股市和加密货币的K线图
前一篇:<从爱尔兰歌曲到莎士比亚:LSTM文本生成模型的优化之旅> 前言:加密货币市场昨日大幅下跌,一天内市值蒸发逾70亿 人民币.有人可能会问,如果使用人工智能模型预测市场的涨跌,是否能 ...
- 从Delphi到Lazarus——我的编程之路
今天终于下定决心,把我使用的编程环境从Delphi转变成Lazarus了.这也许是一个明智的选择,但做出这个决定的过程包含了辛酸和无奈. 这应该是我第三次安装Lazarus了.以前安装之后总是感觉有很 ...
- HttpClient初步理解
昨天做完网站项目,就立刻接到了接口的项目,遇到了httpclient,因为毕业不久,遇到这块所以特此留下理解 HttpClient介绍 概念: HTTP 协议可能是现在 Internet 上使用得最多 ...