【问题标题】:How to get some results mid query using SqlCommand如何使用 SqlCommand 在查询中获得一些结果
【发布时间】:2018-11-20 17:21:09
【问题描述】:

我正在使用SqlCommand 执行查询,但是这个查询通常非常慢 - 大约需要 50 秒才能完成 - 无论如何我可以读取结果,因为它们一一出现?

using (SqlConnection connection = new SqlConnection(ExportMetrics.CreateConnectionString()))
{
    SqlCommand command = new SqlCommand(sqlQuery, connection);
    connection.Open();
    SqlDataReader reader = command.ExecuteReader();

    try
    {
        while (reader.Read())
        {
                //Read results
        }
        catch (Exception e)
        {
            //Exception
        }
        finally
        {  
            reader.Close();
        }
    }
}

【问题讨论】:

  • 简短回答:不。听起来您需要优化查询、添加索引和/或缓存结果集。您也可以尝试异步查询:docs.microsoft.com/en-us/dotnet/api/…
  • 您可以通过将其转换为存储过程、内存优化表、索引等来提高性能。这取决于您的查询是什么样的以及为什么查询很慢,但您不能查看这些记录,它们都作为一个组返回。

标签: c# sqlconnection sqlcommand


【解决方案1】:

“一个一个地”读取结果是 SqlDataReader 已经完成的工作。

这是否有帮助取决于查询。使用 GROUP BY+聚合函数或 ORDER BY1 子句的查询通常必须在服务器内存中实现整个结果集,然后才能开始返回结果。其他语言结构也可能需要这个。没有这些语言功能的查询可能能够更快地开始返回结果,具体取决于执行计划。

但是 50 秒在 SQL 世界中是一个很长的时间。几乎总有一种方法可以重写查询或调整索引以更快地运行。当然,除非我们能够查看查询、表结构和索引,否则我们无能为力。


1 如果 ORDER BY 子句匹配主键或其他与 JOIN 相关的重要索引,使得请求的顺序与用于查询工作集的顺序匹配,并且这可以用数学方式显示,您 可能还是可以的。

【讨论】:

  • “读取结果”一一进入“是 SqlDataReader 已经做的事情。”。是的 - 但在整个结果集可用之前,读者不会返回第一条记录。换句话说,它对“50 秒”没有帮助......
  • @paulsm4 是的,在此答案中描述的条件下,它可以在整个集合可用之前开始返回结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多