当我从代码执行此查询时执行速度比从SQL Server Management Studio执行等效SQL时慢3倍
var myDataContext = new AccessMyDatabaseDataContext();
myDataContext.ObjectTrackingEnabled = false;
var schedule = (from s in myDataContext.MyTable
where s.Date >= StartDate
&& s.Date <= EndDate
&& s.Name == "MySchedule"
&& (s.Status.Equals("LIVE") || s.SomeOtherField.Equals("MyString"))
select s)
.ToList();
我有可变数量的预期记录,因此我无法分配预期记录的直接数量。我认为加时间的原因是Linq2sql只要找到记录就会执行select top 1
语句。
有人知道解决这个问题的方法吗?
修改
最后,它比Linq2Sql更多。 SORRY!
我使用(几乎)相同的语法(上面)使用3个表,在foreach循环中为我的业务对象分配所需的值。问题是,其中一个访问查询没有ToList-Command。 foreach循环将我的List-Objects中的值从我的数据库中取出。
一个尴尬的初学者错误。对不起,谢谢你的帮助!!!
答案 0 :(得分:1)
DbContext的生命周期在MSDN和SO上有所描述。当我替换了我的类变量DbContext时,我注意到了一个很大的改进(一个测试循环重复地将来自2个连接表的所有数据从7分钟减少到4.3秒)。
我相信任何复杂的SQL在存储过程中都更好。 RDBMS只需优化一次。您只返回所需的行。有许多资源可以帮助优化SQL Server中的查询,例如https://msdn.microsoft.com/en-us/library/ff650689.aspx。
经常被忽视的是SQL Server Management Studio的数据库报告功能(2005年推出)。在对象资源管理器中右键单击数据库名称,然后选择Reports - &gt;标准报告 - &gt;任何报告。试验报告。我找到了这个网站http://www.sqlshack.com/sql-server-management-studio-performance-reports/。
答案 1 :(得分:-1)
始终通过注销SQL或启动SQL事件探查器来检查生成的SQL查询。我的猜测是生成的SQL不会坏。你可能会浪费时间的原因:
由于对象的实现,ERM框架总是有点慢。如果您不需要所有字段,请引入.Select()子句以仅选择您实际需要的部分。通常,序列化为非实体类型,例如,进入匿名类型,速度更快。
表达式树的解析可能会耗费相当长的时间。 Linq2Sql中有一个编译查询的概念,它只是第一次解析表达式树。你启用了吗?有很多关于如何做的教程。
话虽如此,因此对于ERM框架而言,因子3不是非典型的。根据您的需要,您可以考虑EntityFrmaework是否更快。或者,有一些超轻量级的ERM框架针对查询性能进行了优化,但用于管理对象并不是很好。
作为最后一种选择,EntityFramework(可能还有Linq2Sql)允许您获取直接SQL字符串。您可以使用此字符串加载DataTable。