实体框架查询优化

Zom*_*Zom 5 linq linq-to-entities entity-framework

我有几个月使用Entity Framework的经验,并且主要是针对它编写了大量的数据检索linq查询.我来自一个沉重的SQL背景,如果我正在尝试调试性能问题,我正在尝试优化一些sql的性能和可读性.

我注意到一些生成的sql为带有列{col1,col2,col3}的tableA做了类似的事情

select
    Extent1.col1
from
(
   select col1, col2, col3 from tableA
) AS Extent1
Run Code Online (Sandbox Code Playgroud)

我的问题是,我如何阻止它做这些无用的派生表,而只是做

select col1 from tableA 
Run Code Online (Sandbox Code Playgroud)

它需要哪里?我似乎无法弄清楚为什么它有时会这样做,有时它不会......

Joe*_*l C 5

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

如果你的经历与我的不同,我有兴趣听听.我停止寻找改变生成的查询的方法,因为对于我尝试过的每个查询,性能没有真正的差异.

编辑: 我的最后一句话并非完全正确,肯定有N + 1种情况需要注意,任何批处理操作(同时更新,删除和插入多个记录)都不会由于使用单个记录的性质,在手表上写一个查询的性能甚至更接近.但是,无关的扩展区基本上被SQL Server查询优化器剥离了.