【问题标题】:How to speed up reading large amounts of data in SQL Server and C#如何加快 SQL Server 和 C# 中大量数据的读取速度
【发布时间】:2015-05-14 19:56:12
【问题描述】:

我的数据库中有一个包含大约 200k 条目的视图。我正在使用以下代码阅读它:

using (SqlConnection conn = new SqlConnection....)
{
    conn.Open();

    string query = "SELECT * FROM SP3DPROJECT.dbo.XSystemHierarchy";

    using (SqlCommand comm = new SqlCommand())
    {
        comm.CommandText = query;
        comm.Connection = conn;

        using (SqlDataReader reader = comm.ExecuteReader())
        {
            DateTime start = DateTime.Now;

            while (reader.Read())
            {
                // Code goes here, but for performance 
                // test I'm letting this empty
            }

            DateTime end = DateTime.Now;
            TimeSpan elapsed = (end- start).TotalSeconds;
        }
    }
}

视图只有两列GUID 类型。 ExecuteCommand() 非常快,但是 while 循环(即使没有代码,只是循环)需要大约 150 秒。

有没有更好或更快的方法来做到这一点?

【问题讨论】:

  • DataSet 不会更快,因为归档 DataSet 使用在 SqlDataReader.Read() 之上实现的 DataAdapter。因此,填充 DataSet 比 RBasniak 的代码更严格。
  • 视图本身呢?从您的视图中选择行的速度有多快?
  • DateTime is not the recommended way to performance test code。使用它可能会产生非常不同的结果。
  • @ErikPhilips:确实如此,但是当结果是150秒时,并不是因为时钟定时器的精度低。
  • 我的钱在你看来很贵。

标签: c# sql-server


【解决方案1】:

尝试对 DataTable 使用 Load 方法。它明显更快。

例子:

DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
return dt;

【讨论】:

  • Load的方法也是从DataReader读取的,为什么你认为它更快?
  • 我同意第一个答案中所说的; “差异可以忽略不计”。
  • 请注意,200,000 行有 2 列 GUID,长度为 16 个字节,是 6.4mb 的数据。检查瓶颈是否是数据量。如果您的客户端与数据库在同一个机器上运行,则使用命名管道可能会有所帮助。
【解决方案2】:

谢谢大家。 cmets 让我考虑读取视图与表,我将查询更改为用于在 SQL Server 中创建视图的完全相同的查询(而不是直接读取视图的所有内容)。

我没有使用SELECT * FROM MyView,而是转到 SQL Server,以设计模式打开视图,并复制为我生成的 SQL 查询。然后我在我的代码中使用了该查询。

我不知道为什么这会产生如此大的差异,但现在将所有数据从 150 秒降至不到 2 秒所需的时间,这对于我的目的来说已经绰绰有余了。

【讨论】:

  • 请在你的答案中添加更多细节,这个答案让我筛选了上面所有的 cmets 并理解了讨论的内容..!
  • @Amit 没有使用 SELECT * FROM MyView,而是使用 SQL Server 在设计模式下打开了视图并复制了它为我生成的 SQL 查询。然后我在我的代码中使用了该查询。
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 2021-02-09
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2018-03-26
相关资源
最近更新 更多