【问题标题】:Why does ToPagedList take half a minute on an empty IQueryable while the underlying SQL runs in just one second?为什么 ToPagedList 在空的 IQueryable 上需要半分钟,而底层 SQL 只需一秒钟?
【发布时间】:2012-09-29 19:31:20
【问题描述】:

我有一段 Entity-to-SQL 代码组成 IQueryable,在其上运行 ToPagedList(),然后将结果传递到 MVC 视图。

ToPagedList() 因运行 SQL 查询超时而失败。我提取了生成的 SQL 查询(使用IQueryable.ToString())并在服务器上运行它 - 它运行时间不到一秒,输出为空(这是正确的)。

所以我让ToPagedList() 运行查询,该查询会产生一个运行半分钟并超时的空结果,并且我有在同一台服务器上运行不到一秒的底层 SQL。

由于 SQL 查询输出为空,我不能将延迟归咎于过滤、检索或 EF 中的其他任何内容。

什么会导致在ToPagedList() 内部产生空输出的快速 SQL 查询运行速度极慢?

UPD

这个问题似乎已经自行解决了,所以看起来这是运行代码的机器和 SQL Server 机器之间的一些临时问题。

【问题讨论】:

  • 您是否尝试使用相同的连接字符串直接从应用程序中调用 SQL 查询?这种情况需要多长时间?
  • (Enumerable.Empty<Object>().AsQueryable()).ToPagedList() 产生了什么?相同的延迟?
  • 这是来自 MvcPager 的 ToPagedList 吗? (还有其他人创建了同名的扩展方法。)
  • @Gert Arnold:来自这件事:nuget.org/packages/PagedList
  • 当你想创建一个Page List时,你通常至少需要总计数。这种特定的操作可能比获取数据本身的成本要高得多。在您的情况下,我会尝试使用 SQL Profiler 并查看 .ToPageList() 方法实际尝试执行的内容,然后尝试自己执行,看看它是否仍然执行。

标签: c# .net sql entity-framework linq-to-entities


【解决方案1】:

确保在您的 SQL Server 上运行 TRACE 并查看 Entity 正在生成的查询,然后检查其执行计划。

在大多数情况下,最新版本的 Entity 在创建健壮查询方面做得很好,但这并不意味着在您要访问的表上放置好 INDEX 会显着加快处理速度。

享受吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 2018-12-31
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多