【问题标题】:How to export more than 1 million rows from SQL Server table to CSV in C# web app?如何在 C# Web 应用程序中将超过 100 万行从 SQL Server 表导出到 CSV?
【发布时间】:2019-12-06 02:30:19
【问题描述】:

我正在尝试将具有 100 万行和 45 列的 SQL Server 表导出到 .csv 文件,供用户通过 Web 界面下载,但它需要很长时间,以至于我最终不得不手动停止该过程。

我使用SqlDataReader 并在阅读器读取时写入文件以避免内存问题。该代码适用于小表(少于 3k 行),但大表继续运行,目标文件保持在 0 KB。

using (spContentConn) { using (var sdr = sqlcmd.ExecuteReader())
    using (CsvfileWriter)
    { 
        DataTable Tablecolumns = new DataTable();

        for (int i = 0; i < sdr.FieldCount; i++)
        {
            Tablecolumns.Columns.Add(sdr.GetName(i));
        }

        CsvfileWriter.WriteLine(string.Join("~", Tablecolumns.Columns.Cast<DataColumn>().Select(csvfile => csvfile.ColumnName)));

        while (sdr.Read())
            for (int j = Tablecolumns.Columns.Count; j > 0; j--)
            {
                if (j == 1)
                    CsvfileWriter.WriteLine("");
                else
                    CsvfileWriter.Write(sdr[Tablecolumns.Columns.Count - j].ToString() + "~");
            }
    }

我使用了此线程中推荐的相同答案,但仍然无效。请帮忙。 export large datatable data to .csv file in c# windows applications

【问题讨论】:

标签: c# asp.net sql-server export-to-csv


【解决方案1】:

从 .NET 文档中不清楚 FileWriter 是否具有高效缓冲,因此当我需要读取/写入大量数据时,我总是使用 BufferedStream。使用流,您将不得不写入字节数据而不是字符串,但这只需要对您的代码进行少量修改。

看起来您正在循环读取和写入 DataTable 的列,这会影响性能。由于在导出操作期间列的数量和顺序不会改变,因此请考虑使用位置索引来访问列值。最好一次写一行而不是一次写一列。

最后,您正在使用数据读取器,因此它应该提供来自 SQL Server 的最佳数据吞吐量(显然,受服务器和带宽的限制)。这也表明性能瓶颈在于将数据写入文件的方式。

作为比较,我只是在 60 秒内将 1,000,000 行 45 列写入文本文件。当然,我的代码不是从数据库中读取的,但这仍然应该为您提供足够好的基线。

【讨论】:

  • 感谢您的回复。我只在数据表中使用标题,对于行,我使用 SQLDataReader。我不能在列名上使用索引,因为列数根据用户要导出的表而有所不同。根据您的反馈,我评论了写入文件并保留阅读器部分的部分,结果这部分也需要很多时间。
  • 我认为您的查询已经被排除为慢,但似乎情况并非如此。你的查询是什么样的?这可能效率低下,因为您的表缺少适当的索引。您知道如何使用 SQL Server 执行计划分析查询性能(假设您使用的是 SQL Server)吗?
  • 是的,它是 SQL Server。这是一个简单的 select * from table 但你是对的,在 SSMS 中运行需要很多时间。 200k 行需要 10 分钟。我不知道如何解决 SQL 查询性能问题,索引是否足够?我的表中有一个 varbinary 列。
  • 查看 SSMS 中的客户端统计信息,了解正在移动的数据量。有 45 列和一个 VARBINARY 列,我怀疑有很多数据。如果不是这种情况,请查看执行计划,然后查看服务器设置。但是,我认为这已经超出了这个问题的范围。
  • 谢谢。我会调查它,但我不能像现在这样导出表格。非常感谢。
猜你喜欢
  • 2023-02-19
  • 2020-04-09
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2016-09-17
  • 1970-01-01
相关资源
最近更新 更多