刚用上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]
http://www.cnblogs.com/zhaopei/p/5721789.html
这篇文章之前看过了,没用啊
@thomaschen: 能够做到那些你写出来的ef性能也不会太差了,还有,sql语句长度和性能确实是没有直接关系,先从基础的做起吧
臃肿不一定就是性能差吧。可以比较一下执行计划。
也许这俩经过sqlserver自身优化,都差不多。。。
而且看你那意思,就是先写select跟先写firstordefault的差别?
不是的,只要去掉orderby ,产生的sql语句就不臃肿了
臃肿不一定就是性能差吧。可以比较一下执行计划。
单纯的从语句的长短来比较性能,是妄言!
光看语句就觉得性能差了啊
@thomaschen:
和你没法交流了。呵呵
看语句就觉得性能差啊,那就别看好了,蒙着眼睛编程估计你能编的好一些。
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已经没意义了。
是的,要是这样就跟自己写sql一样了
您好!请教一下您是怎么获取这些生成的SQL语句的?
使用SQL Server的那个监测工具总是蹦出很多的信息,麻烦能否告知一下,怎样设置只获取VS项目的访问链接,谢谢了!
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>
1.使用Glimpse监控
2.将ef每次生成的sql 记录到log文件中,分析其中sql的性能
谢谢!这个是一个插件吗?
@德展自动化: http://www.cnblogs.com/shanyou/archive/2012/12/25/2831636.html
:Glimpse是一款.NET下的性能测试工具,支持asp.net 、asp.net mvc, EF等等,优势在于,不需要修改原项目任何代码,且能输出代码执行各个环节的执行时间 ,安装方式非常简单,通过nuget直接安装即可。
数据库引擎会对生成的sql做自动优化,除非你写的Linq存在很大的关联错误。话说你为什么不用Dapper来做数据连接组件呢,很轻量级的ORM,操作速度非常快
没有什么问题,两句SQL对于SQL SERVER底层的执行应该是没有太多区别的