我们正在使用实体框架查询SQL Server数据库。 的LINQ表达是IQueryable的。 此查询需要大约10秒来执行。 如果这是在存储过程中,我会玩的查询,使之更有效率。 但是,如果我使用的IQueryable,并实体框架本身决定如何建立一个高效的查询或做我必须玩的LINQ表达式,并改善与试错的表现?
Answer 1:
没有实体框架本身决定如何建立一个有效的查询
EF总会自动确定如何构建查询,和SQL -server也自动地优化查询。
我一定要玩的LINQ表达式,并改善与试错的表现?
您可以尝试与查询,但通常微小的变化发挥不会影响性能(表达式排序方面)
您可以随时使用SQL事件探查器观看的内容EF没有看到查询是多么有效。 如果它需要你很久,你可以重新运行在SSMS查询,并打开包括实际的执行计划 ,并确定在查询速度很慢。
Answer 2:
如果您使用EF 6,您可以启用很容易记录。 然后,您可以检查哪些每次打电话都做。 我就从那里开始。 MSDN EF6记录
你能分享更多一点关于你的查询和结果的大小?
Answer 3:
作为数据库开发人员比C#开发人员,多与接触非常有限的实体框架的细节,我可以说:
我的理解是,实体框架决定如何建立一个查询,可能没有太多的理解能力效率。 可能有一些事情你可以做你的Linq查询或Lambda表达式更好或更差,但在大多数情况下,你可能都不会是能够真正调整的查询。 这是使用ORM,至少从当服务器抓取停了下来,他们不能做任何事情来解决这个查询谁得到在半夜分页数据库管理员的角度来看的一个主要缺点和它不喜欢你永远可以添加一个索引;-)。
我也可以说,你有实体框架中的选项来指定一个存储过程对每个DML操作,这样,如果你真的需要做一些与此特定查询更好,那么仅这一项操作创建一个存储过程,点EF对象给它的选择,但允许EF建立查询INSERT / UPDATE DELETE。
这是否帮助?
文章来源: Entity framework performance tuning