2012-02-22 84 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