首页 新闻 会员 周边 捐助

请问如何优化EF才能产生性能更好的sql语句呢

0
悬赏园豆:15 [已解决问题] 解决于 2016-11-01 15:48

刚用上EF6.0,遇到最大的问题是产生的sql语句比较臃肿,请问该如何优化呢?

能推荐共享几篇博文吗?请给连接

现在碰到的一个问题是,只要用了排序功能产生的sql语句就变臃肿

EF代码

LoadEntities(p => p.StartDate >= dayStart && p.StartDate < dayEnd && p.CompanyID == User.OrgID).AsNoTracking()//这是封装过的,其实就是ef的where查询
        .OrderBy("TaskID desc")
  //.OrderByDescending(p => p.TaskID)
  .Select(p => p.TaskCode).FirstOrDefault();

产生的SQL语句

SELECT TOP (1) 
    [Project1].[TaskCode] AS [TaskCode]
    FROM ( SELECT 
        [Extent1].[TaskID] AS [TaskID], 
        [Extent1].[TaskCode] AS [TaskCode]
        FROM [dbo].[table] AS [Extent1]
        WHERE ([Extent1].[StartDate] >= @p__linq__0) AND ([Extent1].[StartDate] < @p__linq__1) AND ([Extent1].[CompanyID] = @p__linq__2)
    )  AS [Project1]
    ORDER BY [Project1].[TaskID] DESC

我想要的应该是这样的

SELECT 
    [Project1].[TaskCode] AS [TaskCode]
    FROM ( SELECT  TOP (1) 
        [Extent1].[TaskID] AS [TaskID], 
        [Extent1].[TaskCode] AS [TaskCode]
        FROM [dbo].[WL_BGTaskForm] AS [Extent1]
        WHERE ([Extent1].[StartDate] >= @p__linq__0) AND ([Extent1].[StartDate] < @p__linq__1) AND ([Extent1].[CompanyID] = @p__linq__2)
     ORDER BY [Extent1].[TaskID] DESC  )  AS [Project1]
   

 

thomaschen的主页 thomaschen | 初学一级 | 园豆:7
提问于:2016-09-13 15:22
< >
分享
最佳答案
0

http://www.cnblogs.com/zhaopei/p/5721789.html

收获园豆:10
balahoho | 老鸟四级 |园豆:2050 | 2016-09-13 17:27

这篇文章之前看过了,没用啊

thomaschen | 园豆:7 (初学一级) | 2016-09-13 17:47

@thomaschen: 能够做到那些你写出来的ef性能也不会太差了,还有,sql语句长度和性能确实是没有直接关系,先从基础的做起吧

balahoho | 园豆:2050 (老鸟四级) | 2016-09-13 18:25
其他回答(9)
0

臃肿不一定就是性能差吧。可以比较一下执行计划。

长蘑菇星人 | 园豆:1832 (小虾三级) | 2016-09-13 15:26
0

也许这俩经过sqlserver自身优化,都差不多。。。

而且看你那意思,就是先写select跟先写firstordefault的差别?

顾晓北 | 园豆:10893 (专家六级) | 2016-09-13 15:29

不是的,只要去掉orderby ,产生的sql语句就不臃肿了

支持(0) 反对(0) thomaschen | 园豆:7 (初学一级) | 2016-09-13 15:34
0

臃肿不一定就是性能差吧。可以比较一下执行计划。

单纯的从语句的长短来比较性能,是妄言!

czd890 | 园豆:14486 (专家六级) | 2016-09-13 16:17

光看语句就觉得性能差了啊

支持(0) 反对(0) thomaschen | 园豆:7 (初学一级) | 2016-09-13 16:39

@thomaschen: 

和你没法交流了。呵呵

支持(0) 反对(0) czd890 | 园豆:14486 (专家六级) | 2016-09-14 08:54
0

看语句就觉得性能差啊,那就别看好了,蒙着眼睛编程估计你能编的好一些。

爱编程的大叔 | 园豆:30844 (高人七级) | 2016-09-13 17:02
0

EF生成的那个语句的性能好坏不敢说,但生成那样确实让人捉急。其实,真正理想的sql应该是这样的:SELECT TOP (1) [Extent1].[TaskID] AS [TaskID], [Extent1].[TaskCode] AS [TaskCode] FROM [dbo].[WL_BGTaskForm] AS [Extent1] WHERE ([Extent1].[StartDate] >= @p__linq__0) AND ([Extent1].[StartDate] < @p__linq__1) AND ([Extent1].[CompanyID] = @p__linq__2) ORDER BY [Extent1].[TaskID] DESC  外面那层select已经没意义了。

我叫So | 园豆:186 (初学一级) | 2016-09-13 18:06

是的,要是这样就跟自己写sql一样了

支持(0) 反对(0) thomaschen | 园豆:7 (初学一级) | 2016-09-14 14:05
0

您好!请教一下您是怎么获取这些生成的SQL语句的?

使用SQL Server的那个监测工具总是蹦出很多的信息,麻烦能否告知一下,怎样设置只获取VS项目的访问链接,谢谢了!

德展自动化 | 园豆:206 (菜鸟二级) | 2016-09-14 08:33

EF配置修改下就行了,web.config自己配置下

<entityFramework>
    <!--<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />-->
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
    <!--输出EF执行日志-->
  <interceptors>
      <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger,EntityFramework">
        <parameters>
          <parameter value="D:\EF\Log.txt" /><!--文件要子创建好-->
          <parameter value="true" type="System.Boolean" />
        </parameters>
      </interceptor>
    </interceptors>
  </entityFramework>

 

支持(0) 反对(0) thomaschen | 园豆:7 (初学一级) | 2016-09-14 14:02
0

1.使用Glimpse监控

2.将ef每次生成的sql 记录到log文件中,分析其中sql的性能

收获园豆:5
Artikel | 园豆:387 (菜鸟二级) | 2016-09-14 15:57

谢谢!这个是一个插件吗?

支持(0) 反对(0) 德展自动化 | 园豆:206 (菜鸟二级) | 2016-09-17 10:27

@德展自动化: http://www.cnblogs.com/shanyou/archive/2012/12/25/2831636.html

:Glimpse是一款.NET下的性能测试工具,支持asp.net 、asp.net mvc, EF等等,优势在于,不需要修改原项目任何代码,且能输出代码执行各个环节的执行时间 ,安装方式非常简单,通过nuget直接安装即可。

支持(0) 反对(0) Artikel | 园豆:387 (菜鸟二级) | 2016-09-18 14:44
0

   数据库引擎会对生成的sql做自动优化,除非你写的Linq存在很大的关联错误。话说你为什么不用Dapper来做数据连接组件呢,很轻量级的ORM,操作速度非常快

不负春光,努力生长 | 园豆:1382 (小虾三级) | 2016-09-16 16:04
0

没有什么问题,两句SQL对于SQL SERVER底层的执行应该是没有太多区别的

ensleep | 园豆:1682 (小虾三级) | 2016-09-18 13:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册