为啥 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提示颜色?