2012-02-22 81 views
1

我有一個遠程SQL服務器。我想在本服務器中創建一個本地所有表的副本。我不關心本地使用的文件格式,我正在尋找從SQL服務器獲取數據到文件中的最快方法。 (注:服務器端備份是不是一種選擇)將SQL服務器表寫入文件的快速方法

這是我目前的做法:

步驟1。創建一個閱讀器和讀取所有數據爲對象

while (reader.Read()) { 

    var fieldCount = reader.FieldCount; 
    for (int i = 0; i < fieldCount; i++) { 
     objects.Add(reader.GetValue(i)); 
    } 
} 

步驟2的名單。轉換對象爲字符串

List<string> test = new List<string>(); 
foreach (var o in objects) { 
    test.Add(o.ToString()); 
} 

步驟3。寫字符串到(CSV)文件

foreach (var s in test) { 
    backupFile.Write("\""); 
    backupFile.Write(s); 
    backupFile.Write("\";"); 
} 

我已經測量的這些3個步驟的性能:

  • 步驟1需要3秒
  • 步驟2需要2.8秒
  • 步驟3需要0.8秒

我正在尋找一種方法來加快步驟2。有沒有更快的方式讓這些對象到文件? (不必是一個文本文件,二進制本地數據庫文件的也行。)

+1

你很可能做在T-SQL查詢的操作,以便它返回一切CSV格式,而不必去通過在C#中的每個記錄。 – Alexandre 2012-02-22 15:37:40

+0

爲什麼不循環一次數據,並且在您查詢每行時進行字符串轉換和文件寫入? – mbeckish 2012-02-22 15:39:49

+0

我的猜測是最快的機制是使用SQL Server的[批量導出功能(http://msdn.microsoft.com/en-us/library/ms175937.aspx)。有一個bcp.exe實用程序,它似乎完全符合你想要做的事情。 – 2012-02-22 15:42:29

回答

0

如果你不介意那些在本地使用的文件格式,護理談談你的SQL表加載到一個DataTable對象及用途:

datatable.WriteXml("c:\YourFile.xml"); 
+0

這可能會慢得多 – 2012-02-22 15:38:57

+0

@Conrad。正確。加載到DataTable中已經比我當前使用的方法慢得多 – 2012-02-23 07:52:08

+0

更不用說它會將整個表加載到內存中 - 在我的情況下,這將是數百萬行。 : -/ – 2014-01-21 00:41:49

3

爲什麼你完全用三個步驟困擾。

爲什麼不

while (reader.Read()) { 

    var fieldCount = reader.FieldCount; 
    for (int i = 0; i < fieldCount; i++) { 
      backupFile.Write("\""); 
      backupFile.Write(reader.GetValue(i).ToString()); 
      backupFile.Write("\";");; 
    } 
    backupFile.WriteLine(); 
} 

當然,除非你使用兩個線程。將數據推送到集合中的一種。還有一個將數據刷新到文件中的方法。

+0

我已經將我的代碼分解成能夠測量性能的步驟。最終的結果確實是一個循環,但不會更快。 – 2012-02-23 07:49:28

+0

我明白了我不認爲你可以改進'ToString()',但是你可能想考慮把它放在一個單獨的線程中,這樣你可以在寫出文件的時候從數據庫中讀取數據。 (它們都是IO綁定操作,而不是CPU綁定) – 2012-02-23 17:16:04

0

使用OPENROWSET命令。例如:

INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;Database=C:\testing.xls;', 
'SELECT Name, Date FROM [Sheet1$]') 
SELECT [Name], GETDATE() FROM MyTable 
+0

這個c:\ testing.xls會坐在服務器上嗎?我需要在客戶端上。我目前的解決方案無法從客戶端下載此文件(自動) – 2012-02-23 08:03:07