2010-09-22 55 views
0

我已经在数据库中创建了一个视图,该视图为我提供了一个组织结构的表示形式。的确,我在这个视图中使用了getdate()。我已经在我的edmx中导入了视图,并根据这个视图编写了查询。大多数查询与视图一起加入一个表并返回一个DTO。这些查询工作正常,并且当我在SQL事件探查器中对其进行概要分析时,速度很快(200ms)。由于查看重新计算,LinQ查询的持续时间很长

当我在连接表和视图上做一个组时,那么持续时间要长得多。奇怪的是,当我执行LinQ查询的时间非常长,但是当我在SQL Server Management Studio中自己执行生成的查询时,它非常快。我确定这不是由已经计算的缓存或执行计划造成的。 LinQ查询还为我提供了大量的读取和写入,而通过SQL Mgmt Studio进行的查询不会给我写入任何信息,而且读取次数也会减少很多。

我们推测,当通过LinQ执行查询时需要重新计算视图,而不是通过SQL Mgmt Studio执行查询时。

我试过的另一种方法是在数据库中创建一个存储过程。这个存储过程执行与LinQ生成的完全相同的查询。我已经将这个存储过程映射到了edmx中。当我再次通过LinQ调用存储过程时,持续时间非常长(7000毫秒),并且有很多读写操作。当我通过SQL Mgmt Studio执行它时,持续时间与预期的一样(200ms),读取次数少,没有写入。

有什么建议吗? 谢谢

+0

你将不得不提供更多的信息给任何人说这个。例如:视图是怎样的?你的LINQ查询是怎样的? SQL的执行过程如何? – Steven 2010-09-22 10:12:50

回答

0

听起来像Management Studio正在做某种查询计划优化,LINQ无法执行,因为它执行一系列单独的命令。

我建议的是尝试将一组合理的记录带入内存并在那里进行连接。这很容易做到。

假设您有此查询:

var pcs = 
    from p in dc.People 
    join c in dc.Colors on p.FavColor equals c.Name 
    where p.Name == "James" 
    select new { p.Name, c.ColorId }; 

这将产生一系列查询到SQL这可能导致延迟的,你所遇到的类型。

那么试试这个来代替:

var pcs = 
    from p in dc.People.Where(x => x.Name == "James").ToArray() 
    join c in dc.Colors.ToArray() on p.FavColor equals c.Name 
    select new { p.Name, c.ColorId }; 

这应该查询降低一个或两个是非常非常快。您只需确保这不会尝试将50万条记录加载到内存中。如果发生这种情况,您的性能问题将从数据库转移到内存。

我希望这会有所帮助。