【发布时间】:2016-05-01 23:34:30
【问题描述】:
当我从代码中执行此查询时,它的执行速度比从 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 更多。对不起!
我使用(几乎)相同语法(上图)的 3 个表,在 foreach 循环中为我的业务对象分配所需的值。问题是,其中一个访问查询没有 ToList-Command。 foreach 循环将我的 List-Objects 中的值与我的数据库中的值相结合。
一个尴尬的初学者错误。再次抱歉,感谢您的帮助!!!
【问题讨论】:
-
我经常将存储过程用于复杂的 SQL。性能提升是值得的。问题是
myDataContext变得过时了。将代码包装在using var myDataContext = new AccessMyDatabaseDataContext(){} -
向我们展示您在 SQL Server Management Studio 中运行的等效 SQL,以及您对该表的索引和该表的结构。
-
您确定 Select top1 来自此查询,而不是来自您引用某些相关实体信息的列表内容的 foreach()。从这个查询的内容中,我会非常惊讶地看到 N select top 1 statements。
-
@PeterBill:我想我也必须走这条路。我用“using-wrap”试过了,但执行时间几乎一样......
-
@Pleun:在阅读了您的评论后,我再次对其进行了校对,我发现,我有一种不同的方式以另一种方式进行访问。事实上,我忘记了“ToList”- 方法,实际上它与语句一起运行到了 foreach 中。周末模式 - 真丢脸 -.- 我现在让它更易于重复使用。
标签: c# sql-server performance linq-to-sql