【问题标题】:Timing Sql Queries with ADO.NET Entity Data Model使用 ADO.NET 实体数据模型计时 Sql 查询
【发布时间】:2016-06-15 19:41:14
【问题描述】:

Asp.net MVC Web 应用程序中的 NET 实体数据模型。数据库已在 Azure 中启动。我正在尝试使用查询两侧的开始和结束时间来计时我的 Sql 查询。

start = DateTime.Now;
var query = item.Database.SqlQuery<CustomerQuery>(queryString);
end = DateTime.Now;

我正在计算这样花费的时间

Duration = end.Subtract(start);

现在,无论返回多少结果,有时数以千计的时间实际上是相同的。

这是为什么?有没有办法获得更准确的时间

【问题讨论】:

  • 您可以在结果上使用ToList() 或类似方法来实际实现结果(即实际获取它们)。另外,不要使用 DateTime.Now,使用 Stopwatch。
  • 如果要定时查询,请使用 SQL Profiler。如果您还想计时网络延迟等,请将 Glimpse 添加到您的应用程序并检查它为 SQL 访问收集的分析信息。不要尝试自己编写,因为在这种情况下您有 两个 错误:首先您不执行查询,其次您使用不准确的方法来计算持续时间

标签: c# asp.net sql-server entity-framework


【解决方案1】:

好吧,我不是这个堆栈的专家,但似乎 SqlQuery 返回 DbRawSqlQuery 对象,它封装了查询,但不执行它。正如MSDN 所说,“枚举时将执行查询的 DbRawSqlQuery 对象。”

因此您应该具体化查询,例如通过调用ToList()

var query = item.Database.SqlQuery<CustomerQuery>(queryString).ToList();

【讨论】:

  • 感谢@3615 现在完美运行。当我调用超出开始和结束时间的视图时,我正在执行 query.ToList()
【解决方案2】:

DateTime.Now 方法不是计时毫秒的最佳方法,您可以在 Jon here 的回答中了解更多信息。您应该改用 Stopwatch 类,它可以像这样使用。

using System.Diagnostics;

在方法中

var sw = new Stopwatch();
sw.Start();
var query = item.Database.SqlQuery<CustomerQuery>(queryString);
sw.Stop();

var totalTime = sw.ElapsedMilliseconds;

【讨论】:

  • @GertArnold 使用 DateTime 计算持续时间很容易导致这种行为,如果执行速度足够快的话。秒表不使用时钟时间,而是在开始和结束时读取高速性能计数器。 Ellapsed 属性将差异转换为 Ticks、毫秒等
  • 是的,但只是说使用秒表不是答案。
  • @GertArnold 你是对的。我应该解决这个问题,而不是仅仅发布解决方案。我会带着评论家,直到我在这里的下一个答案。
【解决方案3】:

如果您使用的是 Azure,您还可以利用 Application Insights。您可以配置您的应用程序以将信息发送到 Azure。

https://azure.microsoft.com/en-gb/documentation/articles/sql-database-query-performance/ https://azure.microsoft.com/en-gb/documentation/articles/app-insights-asp-net/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多