实体框架Skip方法运行速度非常慢

2023-12-22

我在数据访问层上使用 Entity Framework 5、ObjectContext 和 POCO。我有一个通用存储库实现,并且有一个使用 Skip() 和 Take() 分页查询数据库的方法。一切工作正常,除了跳过大量行时查询性能非常慢(我说的是 170k 行)

这是我对 Linq to Entities 的查询的摘录:

C# Code:

ObjectContext oc = TheOBJEntitiesFactory.CreateOBJEntitiesContext(connection);
var idPred = oc.CreateObjectSet<view_Trans>("view_Trans").AsQueryable();
idPred = idPred.OrderBy(sortColumn, sortDirection.ToLower().Equals("desc"));
var result = idPred.Skip(iDisplayStart).Take(iDisplayLength);
return new PagedResult<view_Trans>(result, totalRecords);

在翻译成 Transact-SQL 的查询中,我注意到没有使用ROW_NUMBER()直接使用视图子句进行子查询并应用ROW_NUMBER()子查询的结果...

example:

select top(10) extent1.A, extent1.B.extent1.C from (
select extent1.A, extent1.B, extent1.C, 
row_number() OVER (ORDER BY [Extent1].[A] DESC) AS [row_number] 
from (
select A,B,C from table as extent1)) as extent1
WHERE [Extent1].[row_number] > 176610
ORDER BY [Extent1].[A] DESC

这大约需要 165 秒才能完成。关于如何提高翻译后的查询语句的性能有什么想法吗?


对于那些不遵循上述评论的人,我怀疑问题不在于额外的SELECT,因为额外的SELECT存在于许多不需要 165 秒运行的 EF 查询中。我最终注意到他的 ObjectSet 引用了VIEW并想知道这是否是问题的一部分。经过一些实验,他将问题缩小到LEFT JOIN视图内。我建议他针对该查询运行数据库调优顾问;他做到了,两个指数表明解决了问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实体框架Skip方法运行速度非常慢 的相关文章

随机推荐