Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 实体框架查询优化_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

Linq 实体框架查询优化

Linq 实体框架查询优化,linq,entity-framework,linq-to-entities,Linq,Entity Framework,Linq To Entities,我有几个月使用Entity Framework的经验,主要是针对它编写大量的数据检索linq查询。我有着丰富的sql背景,如果我试图调试性能问题,我会尝试优化一些sql以提高性能和可读性 我注意到一些生成的sql对列为{col1,col2,col3}的表执行类似的操作 select Extent1.col1 from ( select col1, col2, col3 from tableA ) AS Extent1 我的问题是,如何防止它执行这些无用的派生表,而只是执行这些操作

我有几个月使用Entity Framework的经验,主要是针对它编写大量的数据检索linq查询。我有着丰富的sql背景,如果我试图调试性能问题,我会尝试优化一些sql以提高性能和可读性

我注意到一些生成的sql对列为{col1,col2,col3}的表执行类似的操作

select
    Extent1.col1
from
(
   select col1, col2, col3 from tableA
) AS Extent1
我的问题是,如何防止它执行这些无用的派生表,而只是执行这些操作

select col1 from tableA 

哪里需要它?我似乎不明白为什么有时候会这样,有时候不会

您是否将生成的查询的实际查询执行计划与优化查询的方式进行了比较?你可能会对结果感到惊讶,我知道我是。我对SQL server团队中的开发人员深表敬意,他们似乎在使看似次优的查询执行相同的性能方面做得非常出色

如果你的经验和我的不同,我很想听听;我不再寻找更改生成的查询的方法,因为对于我尝试查看的每个查询,在性能上没有真正的差异

编辑:
我的上一句话并不完全正确,确实存在N+1情况,您必须注意,而且由于处理单个记录的性质,任何批处理操作(同时更新、删除和插入多个记录)在性能上都不会接近手工编写查询。但是SQL Server查询优化器从本质上去除了无关的数据块。

我很想听听其他人的想法;但我认为这只是使用EF(以及其他ORM?)的一个缺点。您对生成的实际SQL失去了很多控制,并且生成的SQL通常非常糟糕。Hi Joel的可能重复,一般来说您是正确的,但我有两个非常讨厌的查询,大约300行长,在整个过程中多次执行“无用的派生表”业务。获取该查询并简单地用后续直接从对应表中选择的表替换派生表需要一个巨大的查询,从7秒到1秒。。。。因此,我在很大程度上同意您的意见,但我正在尝试找出如何更好地优化我的linq,以避免遇到这个问题。@Isamu:通常,如果您可以简化linq查询,SQL也会变得更简单。有很多方法可以做到这一点,但是如果没有任何代码可以查看,很难给出具体的建议。您报告的>7x性能提升是从EF生成的代码中删除不必要的列的直接结果,还是您正在进行更复杂的转换?我假设您在测试性能差异时考虑了查询缓存。。。EF团队博客()上有一篇博文,可以就与生成的SQL的性能改进相关的特定问题提供反馈。这篇特定的帖子谈到了他们在最新版本中处理每类型表类继承层次结构时所做的改进。@StriplingWarrior我没有做什么复杂的事情,只是从查询中的4或5个点删除了我在初始问题中描述的内容。@Zom:Joel C对查询缓存提出了很好的观点。可能是由于参数嗅探导致缓存查询错误,而更改SQL只是一个临时解决方案。如果只从数据块中删除一个列名(从而更改查询以避免缓存执行计划),会发生什么情况?PS——如果您想添加代码,请编辑您的问题并将其放在那里。