为啥 ToPagedList 在空的 IQueryable 上需要半分钟,而底层 SQL 只需一秒钟?

Posted

技术标签:

【中文标题】为啥 ToPagedList 在空的 IQueryable 上需要半分钟,而底层 SQL 只需一秒钟?【英文标题】: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() 方法实际尝试执行的内容,然后尝试自己执行,看看它是否仍然执行。 【参考方案1】:

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

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

享受吧!

【讨论】:

以上是关于为啥 ToPagedList 在空的 IQueryable 上需要半分钟,而底层 SQL 只需一秒钟?的主要内容,如果未能解决你的问题,请参考以下文章

如何在空的edittext上更改材质TextInputLayout提示颜色?

带类的matlab - 将结构保存在空的双数组中

如何将网格线保留在空的 TableView Javafx 中

在空的剑道网格上排序显示旧数据

JPA:在空的多方面将 Fetch 结果加入 NULL

在空的 tibble 中,列类型会根据添加第一行的方式而改变