实战手记:让百万级数据瞬间导入SQL Server

想必每个DBA都喜欢挑战数据导入时间,用时越短工作效率越高,也充分的能够证明自己的实力。实际工作中有时候需要把大量数据导入数据库,然后用于各种程序计算,本文将向大家推荐一个挑战4秒极限让百万级数据瞬间导入SQL Server实验案例。

本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的时间。所用到工具为Visual Studio 2008和SQL Server 2000、SQL Server 2008,分别使用5中方法将100万条数据导入SQL Server 2000与SQL Server 2008中,实验环境是DELL 2850双2.0GCPU,2G内存的服务器。感兴趣的朋友可以下载源代码自己验证一下所用时间。

好了,下面我们分别使用基本的Insert 语句、使用BULK INSERT语句、在多线程中使用BULK INSERT、使用SqlBulkCopy类、在多线程中使用SqlBulkCopy类五种方法,挑战4秒极限。还要有一点需要进行说明,本实验中执行SQL语句的地方使用了IsLine FrameWork框架中的DataProvider模块,这个模块只是对SQL配置的读取和封装,并不会对最终结果有本质性的影响,关于IsLine FrameWork框架方面的知识,请参考“IsLine FrameWork”框架系列文章。

数据库方面使用SQL Server 2000与SQL Server 2008,表名TableB,字段名称为Value1,数据库名可以在App.config中修改,默认为test。

方法一.使用基本的Insert 语句

这种方法是最基本的方法,大多数人一开始都会想到这种方法。但是Insert语句似乎并不适合大批量的操作,是不是这样呢?

本方法中将100万数据分为10个批次,每个批次10万条,每10万条1个事务,分10次导入数据库。

-->基本语句:

Insert Into TableB (Value1) values (‘”+i+”’); 说明:语句中的i是宿主程序中的一个累加变量,用于填充数据库字段中的值。

SQL Server 2000 耗时:901599

SQL Server 2008耗时:497638

方法二.使用BULK INSERT语句

这个类的效果,在本实验中可以说是最令人满意的了,它的使用最简便、灵活,速度很快。

“BULK INSERT”语句似乎不是很常用, Aicken听说Oracle中有一种可以将外部文件映射为Oracle临时表,然后直接将临时表中的数据导入Oracle其他表中的方法,这种方法的速度非常令人满意,SQL SERVER的BULK INSERT是不是同样令人满意呢?

--> 基本语句:

BULK INSERT TableB FROM '

c:\\sql.txt' WITH (FIELDTERMINATOR = ',',ROWTER

/.,mbMINATOR='|',BATCHSIZE = 100000)

说明:“c:\\sql.txt”是一个预先生成的包含100条数据的文件,这些数据以“|”符号分隔,每10万条数据一个事务。

SQL Server 2000耗时:4009

SQL Server 2008耗时:10722

方法三.在多线程中使用BULK INSERT

在方法二的基础上,将100万条数据分五个线程,每个线程负责20万条数据,每5万条一个事物,五个线程同时启动,看看这样的效果吧。

SQL Server 2000耗时:21099

SQL Server 2008耗时:10997

方法四.使用SqlBulkCopy类

这种方法速度也很快,但是要依赖内存,对于几千万条、多字段的复杂数据,可能在内存方面会有较大的消耗,不过可以使用64位解决方案处理这个问题。

几千万条、多字段的数据的情况一般在一些业务场景中会遇到,比如计算全球消费者某个业务周期消费额时,要先获得主数据库表中的会员消费记录快照,并将快照储存至临时表中,然后供计算程序使用这些数据。并且有些时候消费者的消费数据并不在一台数据库服务器中,而是来自多个国家的多台服务器,这样我们就必须借助内存或外存设备中转这些数据,然后清洗、合并、检测,最后导入专用表供计算程序使用。

基本语句:

using (System.Data.SqlClient.SqlBulkCopy sqlBC

= new System.Data.SqlClient.SqlBulkCopy(conn))

{ sqlBC.BatchSize = 100000; sqlBC.BulkCopyTimeout

= 60; sqlBC.DestinationTableName = "dbo.TableB";

sqlBC.ColumnMappings.Add("valueA", "Value1");

sqlBC.WriteToServer(dt); }

说明:

BatchSize = 100000; 指示每10万条一个事务并提交

BulkCopyTimeout = 60; 指示60秒按超时处理

DestinationTableName = "dbo.TableB"; 指示将数据导入TableB表

ColumnMappings.Add("valueA", "Value1"); 指示将内存中valueA字段与TableB中的Value1字段匹配

WriteToServer(dt);写入数据库。其中dt是预先构建好的DataTable,其中包含valueA字段。

SQL Server 2000耗时:4989

SQL Server 2008耗时:10412

方法五.在多线程中使用SqlBulkCopy类

基于方法四,将100万条数据分五个线程,每个线程负责20万条数据,每5万条一个事物,五个线程同时启动,看看这样的效果吧。

SQL 2000耗时:7682

SQL 2008耗时:10870

结果

几天的时间终于把这个实验给完成了,比较令人失望的是SQL SERVER 2008导入数据的性能似乎并不想我们想象的那样优秀。

实战手记:让百万级数据瞬间导入SQL Server相关推荐

  1. BULK INSERT如何将大量数据高效地导入SQL Server

    转载自:http://database.51cto.com/art/201108/282631.htm BULK INSERT如何将大量数据高效地导入SQL Server 本文我们详细介绍了BULK ...

  2. 将Excel文件数据库导入SQL Server

    将Excel文件数据库导入SQL Server的三种方案//方案一: 通过OleDB方式获取Excel文件的数据,然后通过DataSet中转到SQL Server openFileDialog = n ...

  3. PowerShell 导入 SQL Server 的 PS 模块

    接触过UNIX或者Linux 的朋友都知道此类系统有着功能强大.无所不能的壳程序,称之为Shell.微软公司于2006年第四季度正式发布PowerShell,它的出现标志着, 微软公司向服务器领域迈出 ...

  4. net以execl做数据库_C#.NET Excel文件数据导入SQL Server数据库完整代码

    展开全部 在日常的项目中,Excel,Word,txt等格式的数62616964757a686964616fe58685e5aeb931333337626235据导入到数据库中是很常见 这里将分为.n ...

  5. 将Excel数据导入SQL Server数据库

    遇到了一个需求,需要将Excel中的数据导入SQL Server数据库中,当然,不是使用企业管理器之类的直接导入数据的那种,而是要做到程序中.本来我最初的考虑是将Excel中的数据读到dataset中 ...

  6. 从压缩文件将数据导入SQL Server

    介绍 (Introduction) I have seen many organizations receive data from various sources and import into S ...

  7. 使用SSIS包导入SQL Server FILESTREAM数据

    初始配置 (Initial configuration) We have been exploring the SQL Server FILESTREAM feature in this ongoin ...

  8. ssis导入xml_使用SSIS包将XML文档导入SQL Server表

    ssis导入xml This article guides you through importing XML documents into SQL tables using SSIS package ...

  9. 使用SSIS包将多个Excel文件中的数据导入SQL Server表中

    This article explores an SSIS package for importing multiple Excel files data into SQL Server tables ...

最新文章

  1. 放大器非线性失真研究装置设计报告_我校信息学院学子再次斩获大学生电子设计竞赛大奖...
  2. 36岁自学python_Python语言基础
  3. 【Ubuntu入门到精通系列讲解】文件和目录常用命令速查
  4. 16.算法调用优先于手写的循环
  5. java基础之多态的详细解释_JAVA基础之多态
  6. [python] 之 常用内建函数
  7. java 虚类_java虚方法
  8. C语言基于dag的基本块优化,基于dag的基本块优化参考.docx
  9. GCC10.1.0最新版编译
  10. mysql5.6.35安装_mysql5.6.35 二进制快速安装
  11. 微赞企动协会wac_xiehui3.0.9全开源版模块
  12. MySQL数据库安装Version5.7.25
  13. 解决”java.lang.UnsatisfiedLinkError: Native Library .dll already loaded in another classloader”的问题
  14. 怎样成为一名优秀的运维工程师
  15. 大数据毕设选题 - 京东消费数据分析与可视化(python 大数据 机器学习)
  16. 一键批量下载皮皮虾视频
  17. 【Cocos2d-x游戏引擎开发笔记(13)】Tiled Map Editor(一)
  18. OpenLayer学习之style样式的学习笔记
  19. halcon与python混编_halcon与C#混编的入门贴
  20. latex 行间公式大小(批量设置)

热门文章

  1. 信息学奥赛一本通(1113:不与最大数相同的数字之和)
  2. Addition Chains(信息学奥赛一本通-T1443)
  3. No Need(AtCoder-2346)
  4. 骨牌覆盖(51Nod-1031)
  5. 拦截导弹(信息学奥赛一本通-T1289)
  6. 逆波兰表达式(信息学奥赛一本通-T1198)
  7. 整数去重(信息学奥赛一本通-T1117)
  8. php导入excel源码,利用PHPExcel类库,实现PHP导出导入Excel表格Excel文件!
  9. python多线程爬虫数据顺序_Python爬虫必学知识点:多线程爬虫
  10. OpenGL:如何从缓存中读取颜色、深度信息【转】