我们使用实体框架查询SQL服务器数据库。LINQ表达式是IQueryable。这个查询大约需要10秒才能执行。如果这是在存储过程中,我会使用查询来提高效率。但是,如果我使用的是IQueryable,实体框架本身是否决定如何构建高效的查询,还是必须使用linq表达式并通过反复尝试来提高性能?
发布于 2014-03-13 20:43:53
实体框架本身是否决定如何构建高效的查询?
EF总是自动决定如何构建查询,而sql -server也会自动优化查询。
我是否必须使用linq表达式并通过尝试和错误来提高性能?
您可以尝试使用查询,但通常情况下,轻微的更改不会影响性能(就表达式的顺序而言)。
您可以始终使用SQL事件探查器查看EF所做的事情,并查看查询的效率。如果需要很长时间,可以在SSMS中重新运行查询,打开包括实际执行计划并确定查询速度慢的地方。
发布于 2014-03-13 20:39:20
作为数据库开发人员而不是C#开发人员,并且对实体框架细节的了解非常有限,我可以这样说:
我的理解是,实体框架决定了如何构建查询,可能无法很好地理解效率。在Linq查询或Lambda表达式中,可能有一些事情可以做得更好或更糟,但在大多数情况下,您可能无法真正调整查询。这是使用ORM的一个主要缺点,至少从DBA的角度来看,DBA在半夜时会被寻呼,当服务器爬行到停顿时,他们不能做任何事情来修复查询,而且您不能总是添加索引;-)。
我还可以说,您在实体框架中确实有选项为每个DML操作指定一个存储过程,这样如果您确实需要对这个特定的查询做更好的事情,那么就为这个操作创建一个存储过程,并将EF对象指向它以进行SELECT,但允许EF构建INSERT / UPDATE DELETE查询。
这有用吗?
发布于 2014-03-13 20:32:03
如果您使用的是EF 6,您可以很容易地启用日志记录。然后,您可以检查每个调用正在做什么。我会从那里开始。MSDN EF6测井
您能分享更多关于查询和结果大小的信息吗?
https://stackoverflow.com/questions/22389444
复制相似问题