我在这里有一个Linq To Sql query(or 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查询,你可能已经能够解决这个很容易,对此感到遗憾。
你能检查在服务器上执行了哪些查询吗? (在什么查询这是翻译) – 2013-03-14 19:58:36
@GabrielMonteiroNepomuceno我不太明白,但如果你的意思是使用活动监视器,我无法访问它由于权限。你的意思是让你看看创建这个查询的Linq To SQL吗? – TankorSmash 2013-03-14 20:14:40
如果您使用的是Visual Studio Ultimate,并且您打开了intelletrace,并且您将看到所有已重新登录过数据库的查询。如果您没有Visual Studio Ultimate,那么简单的方法是使用本地数据库中的配置文件查看应用程序正在进行的查询。我认为问题在于n + 1个查询。 – 2013-03-15 10:50:02