【问题标题】:Fast way of writing SQL server table into file将 SQL Server 表写入文件的快速方法
【发布时间】:2012-03-12 23:01:45
【问题描述】:

我有一个远程 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 步。有没有更快的方法将这些对象放入文件中? (不一定是文本文件。本地数据库文件的二进制也可以)

【问题讨论】:

  • 您可以在 T-SQL 查询中执行这些操作,这样它就可以返回 CSV 格式的所有内容,而不必遍历 C# 中的每条记录。
  • 为什么不只循环一次数据,然后在从查询中读取每一行时进行字符串转换和文件写入?
  • 我猜最快的机制是使用 SQL Server 的bulk export functionality。有一个 bcp.exe 实用程序似乎可以完全按照您的意愿进行操作。
  • @Dr.Wily'sApprentice 我很确定该方法只能写入服务器有权访问的文件。由于停止服务器端备份的相同限制,可能不可用。
  • 你看过SQL Server提供的bcp (bulk copy) command-line utility吗?应该很快,可以在命令行上进行任何查询,将数据输出到磁盘上的文件中......

标签: c# .net sql sql-server-2005


【解决方案1】:

使用 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

【讨论】:

  • 这个 c:\testing.xls 会放在服务器上吗?我在客户端需要它。在我当前的解决方案中,我无法从客户端下载此文件(自动)
【解决方案2】:

您为什么要精确地执行三个步骤。

为什么不

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();
 }

当然,除非您使用两个线程。将数据推送到集合中的一种。以及将数据刷新到文件中的一种。

【讨论】:

  • 我已将我的代码拆分为能够衡量性能的步骤。最终结果确实会是一个循环,但不会更快。
  • 我明白了,我认为您无法改进ToString(),但您可能需要考虑将其放在单独的线程上,这样您就可以在写出文件时从数据库中获取。 (它们都是 IO 绑定操作而不是 CPU 绑定)
【解决方案3】:

如果你不关心本地使用的文件格式,如何将你的SQL表加载到DataTable对象并使用:

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

【讨论】:

  • 那可能会慢很多
  • @康拉德。正确的。加载到 DataTable 已经比我目前使用的方法慢了很多
  • 更不用说它会将整个表加载到内存中 - 在我的情况下,这将是数百万行。 :-/
猜你喜欢
  • 1970-01-01
  • 2019-07-24
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 2017-02-06
  • 2015-01-27
  • 2016-02-05
  • 1970-01-01
相关资源
最近更新 更多