`

让百万级数据瞬间导入SQL Server

 
阅读更多

让百万级数据瞬间导入SQL Server

 

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

  本实验将使用5中方法完成这个过程,并详细记录各种方法所耗费的时间。所用到工具为eclipse和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导入数据的性能似乎并不想我们想象的那样优秀。

 

本文转载技术论坛上的

分享到:
评论

相关推荐

    百万级数据在Excel和Sql数据库之间相互导入、导出

    3. **T-SQL语句**:使用Transact-SQL(T-SQL)可以直接从Excel文件导入数据到SQL Server表,或者将数据导出到CSV文件,再由Excel打开。例如,BULK INSERT命令适用于大批量导入,而SELECT INTO语句可用于创建新表并...

    SQL Server数据导入SQLite工具

    当我们需要在两者之间进行数据迁移时,就需要借助特定的工具来完成,比如"SQL Server数据导入SQLite工具"。 这个工具的主要功能是将SQL Server数据库转换为SQLite数据库,这对于开发者和数据管理人员来说非常实用。...

    oracle数据库导入到SQL server.docx

    总体思路是:先将Oracle数据库类型转换为SQL Server模式,接着同步Oracle数据到SQL Server数据库,最后迁移Oracle数据到SQL Server数据库。 本文详细讲解了如何使用Microsoft SQL Server Migration Assistant for ...

    sqlserver导入数据

    SQL Server 导入数据 SQL Server 是一个功能强大且广泛使用的关系数据库管理系统,它提供了多种方式来导入数据,其中之一就是从 Excel 文件中导入数据。本文将详细介绍如何使用 SQL Server Management Studio 将 ...

    Oracle数据库导入到SqlServer步骤(图文篇)

    Oracle 数据库到 SqlServer 数据迁移步骤详解 Oracle 数据库到 SqlServer 的数据迁移是一项复杂的任务,需要经过多个步骤来完成。本文将详细介绍如何将 Oracle 数据库导入到 SqlServer 中。 Step 1-6: 数据源设置...

    ASP实现 将Excel表格数据批量导入到SQLServer数据库

    5. 数据库操作:包括插入数据到临时表中,删除临时表,以及向SQLServer数据库中导入数据。在执行SQL语句时,需要特别注意SQL语句的正确性和安全性,避免SQL注入等安全问题。 6. 代码执行效率优化:在导入过程中,...

    XlsToSql;Excel导入SqlServer工具

    1. **数据准备**:首先,用户需要准备好包含待导入数据的Excel文件,确保数据格式符合SqlServer的数据类型要求,例如数字、字符串、日期等。 2. **配置连接**:启动XlsToSql后,用户需要设置数据库连接参数,包括...

    Excel导入SQLserver源码_excel2sql.zip

    这个压缩包文件"Excel导入SQLserver源码_excel2sql.zip"很可能包含了一个程序或脚本,用于自动化从Excel文件批量导入数据到SQL Server的过程。通常,这样的工具会使用编程语言如Python、C#、VB.NET或PowerShell来...

    MySql数据导入SqlServer

    - SQL Server Management Studio (SSMS):用于管理和导入数据到SQL Server。 2. **创建ODBC数据源** - 安装完MySQL ODBC驱动后,打开“ODBC Data Source Administrator”(在Windows上,可以通过搜索栏找到)。 ...

    XML导入SQLServer

    XML导入SQLServer工具,配置简单,支持大批量导入到SQLServer。

    Excel导入SQLserver源码

    总结,"Excel导入SQLserver源码_excel2sql"是一个用于自动化Excel数据导入SQL Server的代码示例,它利用了ADO.NET库,提供了一种高效、灵活的方式来处理数据迁移。对于需要定期或一次性将大量Excel数据导入SQL ...

    DataImportSeverTable.zip excel导入sqlserver2000

    4. **目标设置**:在“目标”部分,选择你的SQL Server数据库作为目标,并指定要导入数据的表。如果需要,你可以创建新表来容纳Excel数据。 5. **映射字段**:在“选择源和目标字段”界面,你可以对源Excel列和目标...

    将access数据库中的表数据导入到sqlserver2005数据库.doc

    - 表结构:Access中的表结构(如主键、索引、触发器等)可能需要在SQL Server中重建,确保在导入数据前处理好这些结构问题。 通过以上步骤,你已经成功将Access数据库中的表数据导入到了SQL Server 2005。这个过程...

    SqlServer数据导入工具

    【SqlServer数据导入工具】是一种高效实用的软件,旨在帮助用户便捷地将各种格式的数据文件,如Access、Excel、DBF、TXT、CSV以及XML文件,批量导入到Sql Server数据库中。这一工具极大地简化了数据迁移过程,对于...

    把.xls文件数据导入SQL Server

    3. 在“导入数据”向导中,选择“从源到目标”,然后选择“文件流”作为数据源,浏览并选择你的.xls文件。 4. 选择“OLE DB 目标”作为目标,然后下一步。 5. 配置数据源和目标。在“源”页面,确认Excel文件路径...

    excel数据导入到sql server数据库中,

    - **BULK INSERT T-SQL命令**:对于大量数据,可以使用BULK INSERT语句直接从Excel文件批量导入数据。需要将Excel文件保存为CSV格式,因为BULK INSERT只支持文本格式。 - **Openrowset函数**:通过在查询中使用...

    excel数据导入SQL server 2000:for delphi 7

    - "sqlserver2000": 特指SQL Server 2000作为目标数据库。 在实际开发中,"excelTOSql"可能是一个包含完成此功能的源代码或示例项目的文件,用于帮助开发者理解和实现Excel到SQL Server 2000的数据导入。

    极限挑战—C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)

    以上就是这几天的实验结果了,比较令人失望的是SQL SERVER 2008导入数据的性能似乎并不想我们想象的那样优秀。 另外,有下载源代码的帮我看看,为什么多线程的成绩还不如单线程的优秀呢?是静态资源使用不当造成的...

    sql server 数据库导入导出方法

    SQL Server 数据库导入导出的方法 SQL Server 数据库导入导出是数据库管理员和开发者常用的操作,目的是将数据库备份到本地或网络存储设备中,以便在需要时恢复数据库或将数据库迁移到其他服务器上。下面将详细介绍...

Global site tag (gtag.js) - Google Analytics