原文:不同版本的SQL Server之间数据导出导入的方法及性能比较
工作中有段时间常常涉及到不同版本的数据库间导出导入数据的问题,索性整理一下,并简单比较下性能,有所遗漏的方法也欢迎讨论、补充。
00.建立测试环境
01.使用SQL Server Import and Export Tool
02.使用Generate Scripts
03.使用BCP
04.使用SqlBulkCopy
05.使用Linked Server进行数据迁移
06.使用RedGate的SQL Data Compare
07.结果对比
可以先看下测试的结果
00.建立测试环境
建立一个测试的环境,一个数据源数据库,版本为SQL Server 2008,一个目标数据库,版本为SQL Server 2000。
实验环境如下图所示,源数据库使用语句生成了100万的测试数据。
2 DROP TABLE DEMOTABLE
3 GO
4 CREATE TABLE DEMOTABLE
5 (
) ,
) ,
)
9 )
INSERT INTO DEMOTABLE
NEWID() ,
NEWID() ,
NEWID()
FROM MASTER..SPT_VALUES T1
01.使用SQL Server Import and Export Tool
使用SQL Server Import and Export Tool进行数据的导出,也可以在目标数据库端使用Import进行导入,这部分套件也是SSIS的一部分。
在源数据库上右键,选择Task -> Export Data
分别填写源数据库和目标数据库的连接信息。
选择“copy data from one or more tables or views”
选择需要导数据的表,并且可以编辑列的Mapping关系。
可以选择立即执行或者存储为SSIS的包,用于执行计划等其他用途。
这里我们选择立即执行。
注意导入的时候如果遇到如下的错误
Error 0xc02020f4: Data Flow Task: The column "Tel" cannot be processed because more than one code page (936 and 1252) are specified for it.
(SQL Server Import and Export Wizard)
是因为两边的数据库的Collation设置不一样造成的,需要设置同样的Collation。
- 用时约1分30秒
02.使用Generate Scripts生成脚本
在源数据库上右键,选择Task -> Geneate Scripts...
配置相关信息,注意选择数据库的版本并将Script Data设置成True。
这里需要注意,因为有100万的数据,所以导出的SQL文件就有400多M,所以用SQL Server Management Studio是打不开的。
所以只能使用sqlcmd执行。
- 用时约28分钟
03.使用BCP进行导出导入
在尝试了前面两个效率低下的工具之后,我们终于开始尝试下SQL Server中专门用于导数据的工具:BCP。
关于BCP的详细用法可以参见MSDN的帮助文档。
我们先使用BCP导出数据。
-U和-P后面分别为数据库的用户名和密码。
我们可以看到100万的数据导出仅用了1.8秒。
现在我们再使用BCP进行导入。
执行后发现,导入数据使用了20.8秒,还是很快的。
- 用时1.872秒+20.810秒=22.682秒
04.使用SqlBulkCopy
.NET Framework 2.0中增加的SqlBulkCopy类可以进行高效的数据迁移动作,这也为代码实现数据迁移提供了接口。
并且SqlBulkCopy类提供了修改字段Mapping关系的方法ColumnMappings。
2 using System.Data;
3 using System.Data.SqlClient;
4
5 namespace BulkInsert
6 {
7 static class Program
8 {
9 static void Main()
{
DateTime dateTimeStart = DateTime.Now;
Console.WriteLine("Start Insert:" + dateTimeStart.ToString("HH:mm:ss fff"));
//导入导出的数据库连接
SqlConnection connectionDestination = new SqlConnection("Server =.; User ID=datascan; Password=DTSbsd7188228; Initial CataLog=ExportDataDemo_Destination;");
SqlConnection connectionSource = new SqlConnection("Server =.; User ID=datascan; Password=DTSbsd7188228; Initial CataLog=ExportDataDemo_Source;");
//实例化一个SqlBulkCopy
};
//获取源数据库的数据
SqlCommand sqlcmd = new SqlCommand("SELECT * FROM DEMOTABLE", connectionSource);
SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlcmd);
DataTable dataTableSource = new DataTable();
sqlDataAdapter.Fill(dataTableSource);
//可以重新定义字段的Mapping关系
//SqlBulkCopyColumnMapping sqlBulkCopyColumnMapping = new SqlBulkCopyColumnMapping("COL1", "NEW_COL1");
//bulker.ColumnMappings.Add(sqlBulkCopyColumnMapping);
connectionDestination.Open();
bulker.WriteToServer(dataTableSource);
bulker.Close();
DateTime dateTimeEnd = DateTime.Now;
Console.WriteLine("Insert Ending:" + dateTimeEnd.ToString("HH:mm:ss fff"));
}
}
}
执行后
- 用时14.8秒
05.使用Linked Server进行数据迁移
先在源数据库上对目标数据库建立Linked Server,或者反过来也行。
@srvproduct = 'Export Data Testing', @provider = 'MSDASQL',
@provstr = 'DRIVER={SQL Server};SERVER=192.168.21.165;UID=sa;PWD=password;'
2 DECLARE @end_date DATETIME
3 SELECT @begin_date = GETDATE()
4
5 INSERT INTO LinkedServerToDemo.ExportDataDemo_Destination.dbo.DEMOTABLE
6 SELECT *
7 FROM ExportDataDemo_Source.dbo.DEMOTABLE
8
9 SELECT @end_date = GETDATE()
SELECT DATEDIFF(ms, @begin_date, @end_date) AS '用时/毫秒'
执行用时
用时7.97分钟
06.使用RedGate的SQL Data Compare进行数据迁移
第三方的工具,有数据库结构比较的工具SQL Compare和数据比较工具SQL Data Compare。
执行
因为也是生成INSERT的SQL执行的,所以就不做过多比较了,上面已经测试过了。
07.结果对比
因为这里测试的环境有网络和表结构的特殊情况,不能说明所有情况下效能的差异,但是也可作为参考之用。
下面给出比较结果。
不同版本的SQL Server之间数据导出导入的方法及性能比较的更多相关文章
-
SQL Server批量数据导出导入BCP&;Bulk使用
数据导出导入,首先考虑使用什么技术实现导出与导入利用BCP结合Bulk技术实现数据的导出与导入 1.bcp数据导出(这里是命令行方式),导出的数据需是格式化的,有两种方式可选 a.对传输的数据格式要求 ...
-
SQL Server批量数据导出导入BCP使用
BCP简介 bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据.bcp可以将数据库的表或视图直接导出,也能通过 ...
-
SQL Server批量数据导出导入Bulk Insert使用
简介 Bulk insert命令区别于BCP命令之处在于它是SQL server脚本语句,它可以将本地或远程的文件数据批量导入数据库,速度非常之快:远程文件必须共享才行, 文件路径须使用通用约定(UN ...
-
在SQL Server中将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做 ...
-
SQL Server 将数据导出为XML和Json
有时候需要一次性将SQL Server中的数据导出给其他部门的也许进行关联或分析,这种需求对于SSIS来说当然是非常简单,但很多时候仅仅需要一次性导出这些数据而建立一个SSIS包就显得小题大做,而SQ ...
-
SQL Server将数据导出到SQL脚本文件
http://www.studyofnet.com/news/list-8883.2-1-4.html 一.SQL Server 2008将数据导出到SQL脚本文件 1.打开SQL Server200 ...
-
从高版本的 SQL Server 向低版本的 SQL Server 转移数据
1.在源数据库上右键任务,选择生成脚本- 2.在生成脚本的高级选项中,根据数据库的内容,选择相应的选项,主要是红框圈出的部分,最后选择仅架构(若数据库的数据量不大,可以直接导出 架构和数据,在新数据库 ...
-
Azure 云平台用 SQOOP 将 SQL server 2012 数据表导入 HIVE / HBASE
My name is Farooq and I am with HDinsight support team here at Microsoft. In this blog I will try to ...
-
Sql Server中三种字符串合并方法的性能比较
文章来自:博客园-DotNet菜园 最近正在处理一个合并字符吕的存储过程,在一个测试系统的开发中,要使用到字符串合并功能,直接在Sql中做.示例:有表內容﹕名称 內容1 abc1 ...
随机推荐
-
Unity时钟定时器插件
Unity时钟定时器插件 http://dsqiu.iteye.com/blog/2020603https://github.com/joserocha3/KillerCircles/blob/67a ...
-
FragmentPagerAdapter实现刷新
在fragmentpageadapter的instantiateItem方法里,他会先去FragmentManager里面去查找有没有相关的fragment如果有就直接使用如果没有才会触发fragme ...
-
Android离线缓存
android做到一定程度,需要考虑缓存的问题,不信可以掏出手机看看淘宝等一些app是否无网的情况下还可以浏览,不过大部分app并没有考虑到这些问题,解决Android的缓存有哪些方法呢 1.IO流读 ...
-
Python-接口自动化(九)
python操作Excel处理测试数据(九) (十)python操作Excel读/写测试数据 1.夹心饼干 setUp:在每一条测试用例执行之前执行 tearDown:在每一条测试用例执行之后执行 上 ...
-
python time 和 datetime模块
time模块 时间相关的操作,时间有三种表示方式: 时间戳 1970年1月1日之后的秒,即:time.time() 格式化的字符串 2014-11-11 11:11, ...
-
DAY02、正式介绍python
一.编程语言介绍(***) 1.1.机器语言:直接用计算机能理解的二进制指令编写程序,直接控制硬件 1.2.汇编语言:用英文标签取代二进制指令编写程序,本质也是直接控制硬件 1.3.高级语言:用人类能 ...
-
Spider-one
1. 爬虫是如何采集网页数据的: 网页的三大特征: -1. 每个网页都有自己的 URL(统一资源定位符)地址来进行网络定位. -2. 每个网页都使用 HTML(超文本标记语言)来描述页面信息. -3. ...
-
spring boot 使用及最佳实践
第一部分,spring boot 文档 Spring boot的使用 使用maven进行构建 用户可以通过继承spring-boot-starter-parent来获取默认的依赖. l 默认java ...
-
ros service
Server部分: #!/usr/bin/env python import sys import os import rospy #from beginner.srv import * from b ...
-
【uoj#164】[清华集训2015]V 线段树维护历史最值
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...