天天看點

不同版本的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.結果對比

可以先看下測試的結果

不同版本的SQL Server之間資料導出導入的方法及性能比較

建立一個測試的環境,一個資料源資料庫,版本為SQL Server 2008,一個目标資料庫,版本為SQL Server 2000。

實驗環境如下圖所示,源資料庫使用語句生成了100萬的測試資料。

不同版本的SQL Server之間資料導出導入的方法及性能比較
不同版本的SQL Server之間資料導出導入的方法及性能比較
不同版本的SQL Server之間資料導出導入的方法及性能比較

建立測試表并生成100萬的測試資料

 1 IF OBJECT_ID('DEMOTABLE') IS NOT NULL 

 2     DROP TABLE DEMOTABLE

 3 GO

 4 CREATE TABLE DEMOTABLE

 5     (

 6       COL1 VARCHAR(50) ,

 7       COL2 VARCHAR(50) ,

 8       COL3 VARCHAR(50)

 9     )

10 INSERT  INTO DEMOTABLE

11         SELECT TOP 1000000

12                 NEWID() ,

13                 NEWID() ,

14                 NEWID()

15         FROM    MASTER..SPT_VALUES T1

16                 INNER JOIN MASTER..SPT_VALUES T2 ON 1 = 1

17                 INNER JOIN MASTER..SPT_VALUES T3 ON 1 = 1

 01.使用SQL Server Import and Export Tool

使用SQL Server Import and Export Tool進行資料的導出,也可以在目标資料庫端使用Import進行導入,這部分套件也是SSIS的一部分。

在源資料庫上右鍵,選擇Task -> Export Data

不同版本的SQL Server之間資料導出導入的方法及性能比較

分别填寫源資料庫和目标資料庫的連接配接資訊。

不同版本的SQL Server之間資料導出導入的方法及性能比較
不同版本的SQL Server之間資料導出導入的方法及性能比較

選擇“copy data from one or more tables or views”

選擇需要導資料的表,并且可以編輯列的Mapping關系。

不同版本的SQL Server之間資料導出導入的方法及性能比較

可以選擇立即執行或者存儲為SSIS的包,用于執行計劃等其他用途。

這裡我們選擇立即執行。

不同版本的SQL Server之間資料導出導入的方法及性能比較

注意導入的時候如果遇到如下的錯誤

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...

不同版本的SQL Server之間資料導出導入的方法及性能比較

配置相關資訊,注意選擇資料庫的版本并将Script Data設定成True。

不同版本的SQL Server之間資料導出導入的方法及性能比較

這裡需要注意,因為有100萬的資料,是以導出的SQL檔案就有400多M,是以用SQL Server Management Studio是打不開的。

是以隻能使用sqlcmd執行。

不同版本的SQL Server之間資料導出導入的方法及性能比較
不同版本的SQL Server之間資料導出導入的方法及性能比較

sqlcmd語句

1 C:\>sqlcmd -i export.sql -d ExportDataDemo_Destination -s 192.168.21.165 -U sa -P 1234567890

  • 用時約28分鐘

 03.使用BCP進行導出導入

在嘗試了前面兩個效率低下的工具之後,我們終于開始嘗試下SQL Server中專門用于導資料的工具:BCP。

關于BCP的詳細用法可以參見

MSDN的幫助文檔

我們先使用BCP導出資料。

不同版本的SQL Server之間資料導出導入的方法及性能比較

-U和-P後面分别為資料庫的使用者名和密碼。

不同版本的SQL Server之間資料導出導入的方法及性能比較

我們可以看到100萬的資料導出僅用了1.8秒。

現在我們再使用BCP進行導入。

不同版本的SQL Server之間資料導出導入的方法及性能比較

執行後發現,導入資料使用了20.8秒,還是很快的。

不同版本的SQL Server之間資料導出導入的方法及性能比較
  • 用時1.872秒+20.810秒=22.682秒

 04.使用SqlBulkCopy

.NET Framework 2.0中增加的

SqlBulkCopy類

可以進行高效的資料遷移動作,這也為代碼實作資料遷移提供了接口。

并且SqlBulkCopy類提供了修改字段Mapping關系的方法

ColumnMappings
不同版本的SQL Server之間資料導出導入的方法及性能比較
不同版本的SQL Server之間資料導出導入的方法及性能比較

使用SqlBulkCopy類進行資料遷移

 1 using System;

 2 using System.Data;

 3 using System.Data.SqlClient;

 4 

 5 namespace BulkInsert

 6 {

 7     static class Program

 8     {

 9         static void Main()

10         {

11             DateTime dateTimeStart = DateTime.Now;

12             Console.WriteLine("Start Insert:" + dateTimeStart.ToString("HH:mm:ss fff"));

13             //導入導出的資料庫連接配接

14             SqlConnection connectionDestination = new SqlConnection("Server =.; User ID=datascan; Password=DTSbsd7188228; Initial CataLog=ExportDataDemo_Destination;");

15             SqlConnection connectionSource = new SqlConnection("Server =.; User ID=datascan; Password=DTSbsd7188228; Initial CataLog=ExportDataDemo_Source;");

16 

17             //執行個體化一個SqlBulkCopy

18             var bulker = new SqlBulkCopy(connectionDestination) { DestinationTableName = "DEMOTABLE", BulkCopyTimeout = 600 };

19 

20             //擷取源資料庫的資料

21             SqlCommand sqlcmd = new SqlCommand("SELECT * FROM DEMOTABLE", connectionSource);

22             SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(sqlcmd);

23             DataTable dataTableSource = new DataTable();

24             sqlDataAdapter.Fill(dataTableSource);

25 

26             //可以重新定義字段的Mapping關系

27             //SqlBulkCopyColumnMapping sqlBulkCopyColumnMapping = new SqlBulkCopyColumnMapping("COL1", "NEW_COL1");

28             //bulker.ColumnMappings.Add(sqlBulkCopyColumnMapping);

29             connectionDestination.Open();

30             bulker.WriteToServer(dataTableSource);

31             bulker.Close();

32             DateTime dateTimeEnd = DateTime.Now;

33             Console.WriteLine("Insert Ending:" + dateTimeEnd.ToString("HH:mm:ss fff"));

34         }

35     }

36 }

執行後

不同版本的SQL Server之間資料導出導入的方法及性能比較
  • 用時14.8秒

先在源資料庫上對目标資料庫建立Linked Server,或者反過來也行。

不同版本的SQL Server之間資料導出導入的方法及性能比較
不同版本的SQL Server之間資料導出導入的方法及性能比較

建立Linked Server

1 EXEC sp_addlinkedserver @server = 'LinkedServerToDemo',

2     @srvproduct = 'Export Data Testing', @provider = 'MSDASQL',

3     @provstr = 'DRIVER={SQL Server};SERVER=192.168.21.165;UID=sa;PWD=password;'

不同版本的SQL Server之間資料導出導入的方法及性能比較
不同版本的SQL Server之間資料導出導入的方法及性能比較

是用INSERT INTO...SELECT...進行導入

 1 DECLARE @begin_date DATETIME

 2 DECLARE @end_date DATETIME

 3 SELECT  @begin_date = GETDATE()

 5 INSERT  INTO LinkedServerToDemo.ExportDataDemo_Destination.dbo.DEMOTABLE

 6         SELECT  *

 7         FROM    ExportDataDemo_Source.dbo.DEMOTABLE

 8         

 9 SELECT  @end_date = GETDATE()

10 SELECT  DATEDIFF(ms, @begin_date, @end_date) AS '用時/毫秒' 

執行用時

不同版本的SQL Server之間資料導出導入的方法及性能比較
  • 用時7.97分鐘

06.使用RedGate的SQL Data Compare進行資料遷移

第三方的工具,有資料庫結構比較的工具SQL Compare和資料比較工具SQL Data Compare。

不同版本的SQL Server之間資料導出導入的方法及性能比較

執行

不同版本的SQL Server之間資料導出導入的方法及性能比較

因為也是生成INSERT的SQL執行的,是以就不做過多比較了,上面已經測試過了。

因為這裡測試的環境有網絡和表結構的特殊情況,不能說明所有情況下效能的差異,但是也可作為參考之用。

下面給出比較結果。

不同版本的SQL Server之間資料導出導入的方法及性能比較

作者:

Parry

出處:

http://www.cnblogs.com/parry/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。