我有几个月使用Entity Framework的经验,并且主要针对它编写了大量的数据检索linq查询。我来自一个沉重的SQL背景,如果我正在尝试调试性能问题,我正在尝试优化一些sql的性能和可读性。
我注意到一些生成的sql对于包含{col1,col2,col3}列的tableA执行此类操作
select
Extent1.col1
from
(
select col1, col2, col3 from tableA
) AS Extent1
我的问题是,如何阻止它执行这些无用的派生表,而只是做
select col1 from tableA
需要哪里?我似乎无法弄清楚为什么它有时会这样做,有时它不会......
答案 0 :(得分:5)
您是否将生成的查询的实际查询执行计划与优化它的方式进行了比较?你可能会对结果感到惊讶,我知道我是。我对SQL服务器团队中的开发人员深表敬意,他们似乎在做出看起来像次优查询的内容方面表现非常出色。
如果您的经历与我的不同,我有兴趣听听;我停止寻找改变生成的查询的方法,因为对于我尝试过的每个查询,性能没有真正的差异。
修改强> 我的最后一个陈述并不完全正确,肯定有N + 1种情况需要注意,任何批处理操作(同时更新,删除和插入多个记录)都不会是均匀的由于处理单个记录的性质,在性能方面接近于手工编写查询。但是,无关的扩展区基本上被SQL Server查询优化器剥离了。