2013-03-14 72 views
6

我在这里有一个Linq To Sql queryor with brackets),它适用于我的本地SQL2008,大约在00:00:00〜00:00:01之间,但在远程服务器上,它占用00:02:10秒。有一个在dbo.Movies,dbo.Boxarts约56k的项目,并在dbo.OmdbEntriesDbContext在远程服务器上超时

{SELECT 
//pull distinct t_meter out of the created object 
Distinct2.t_Meter AS t_Meter 
//match all movie data on the same movie_id 
FROM (SELECT DISTINCT 
     Extent2.t_Meter AS t_Meter 
     FROM dbo.Movies AS Extent1 
     INNER JOIN dbo.OmdbEntries AS Extent2 ON Extent1.movie_ID = Extent2.movie_ID 
     INNER JOIN dbo.BoxArts AS Extent3 ON Extent1.movie_ID = Extent3.movie_ID 
     //pull the genres matched on movie_ids 
     INNER JOIN (SELECT DISTINCT 
       Extent4.movie_ID AS movie_ID 
       FROM dbo.MovieToGenres AS Extent4 
       //all genres matched on movie ids 
       INNER JOIN dbo.Genres AS Extent5 ON Extent4.genre_ID = Extent5.genre_ID) AS Distinct1 ON Distinct1.movie_ID = Extent1.movie_ID 
     WHERE 1 = 1 
//sort the t_meters by ascending 
) AS Distinct2 
ORDER BY Distinct2.t_Meter ASC} 

300K内查询首先把表中的所有相关项目,然后创建一个新的对象,然后从该对象,只找到非空的t_Meter。然后从这些t_Meter s中选择不同的项目然后对它们进行排序,返回98左右的列表ints

我对SQL数据库还不太了解,或者不直观地知道这是否是一组极端的数据库调用放入单个查询,但因为它只需要一秒或更少的时间在我的本地服务器上,我认为这是没问题的。


编辑:这里的LINQ代码,我还没有真正清理所有:http://pastebin.com/JUkdjHDJ它的混乱,但它可以完成...我发现修复程序后OrderBy调用ToArray的工作,但Distinct前非常有帮助。因此,而不是

var results = IQueryableWithDBDatasTMeter.Distinct().OrderBy().ToArray() 

我做

var orderedResults = IQueryableWithDBDatasTMeter.OrderBy().ToArray() 
var distinctOrderedResults = orderedResults.Distinct().ToArray() 

我敢肯定,有我挂了LINQ的代码(并清除它),而不是自动生成的SQL查询,你可能已经能够解决这个很容易,对此感到遗憾。

+0

你能检查在服务器上执行了哪些查询吗? (在什么查询这是翻译) – 2013-03-14 19:58:36

+0

@GabrielMonteiroNepomuceno我不太明白,但如果你的意思是使用活动监视器,我无法访问它由于权限。你的意思是让你看看创建这个查询的Linq To SQL吗? – TankorSmash 2013-03-14 20:14:40

+0

如果您使用的是Visual Studio Ultimate,并且您打开了intelletrace,并且您将看到所有已重新登录过数据库的查询。如果您没有Visual Studio Ultimate,那么简单的方法是使用本地数据库中的配置文件查看应用程序正在进行的查询。我认为问题在于n + 1个查询。 – 2013-03-15 10:50:02

回答

0

这里的LINQ代码,我还没有真正清理所有:http://pastebin.com/JUkdjHDJ它的混乱,但它可以完成...我发现修复程序后OrderBy调用ToArray的工作,但Distinct之前帮助了极大。因此,而不是

var results = IQueryableWithDBDatasTMeter.Distinct().OrderBy().ToArray() 

var orderedResults = IQueryableWithDBDatasTMeter.OrderBy().ToArray() 
var distinctOrderedResults = orderedResults.Distinct().ToArray() 

我想它的工作原理,因为它的运行Distinct只针对存储阵列,而不是整个数据库的价值条目?我不确定,因为旧的LINQ在我的本地服务器上完美无缺地工作。

我确定我已经链接了Linq代码(并清理了它)而不是自动生成的SQL查询,您可以很容易地解决这个问题,对此抱歉。