【发布时间】:2013-03-03 00:06:23
【问题描述】:
我这里有一个Linq To Sql query (or with brackets),它可以在我的本地 SQL2008 上运行,大约在 00:00:00 到 00:00:01 秒,但在远程服务器上,它需要大约 00:02 :10 秒。在 dbo.Movies、dbo.Boxarts 中大约有 56k 项,在 dbo.OmdbEntries 中有 300k 项
{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}
内部查询首先获取表中的所有相关项,然后创建一个新对象,然后从该对象中仅找到不为空的t_Meters。然后从那些t_Meters 中,只选择不同的项目,然后对它们进行排序,返回一个包含 98 个左右 ints 的列表。
我对 SQL 数据库的了解还不够,无法直观地知道这是否是一组极端的 db 调用来放入单个查询中,但由于在我的本地服务器上只需要一秒钟或更短的时间,我以为没关系。
编辑:这是我根本没有真正清理过的 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 查询,您应该能够轻松解决这个问题,对此感到抱歉。
【问题讨论】:
-
你能检查一下服务器上执行了哪些查询吗? (在什么查询中翻译)
-
@GabrielMonteiroNepomuceno 我不太明白,但如果您的意思是使用活动监视器,由于权限,我无法访问它。您的意思是向您展示创建此查询的 Linq To SQL 吗?
-
如果您使用 Visual Studio Ultimate 并打开 Intelletrace,您将看到所有针对您的数据库的查询。如果您没有 Visual Studio Ultimate,那么简单的方法就是使用本地数据库上的配置文件来查看您的应用程序正在执行什么查询。我认为问题出在 n+1 个查询上。
-
远程服务器是否具有完全相同的架构,包括索引定义?您能否检查本地计算机和远程服务器的执行计划是否相同(在 Sql Server Management Studio 中)?您也可以尝试将查询分成三个单独的查询,看看是否有帮助(或者至少您知道哪一部分需要这么长时间)。
-
如果您发布 Linq 查询可能会有所帮助,否则您应该将其标记为 SQL 而不是 Linq。另外,为什么查询执行与似乎未使用的 BoxArts 和 Genres 的连接。这只是为了排除没有相关记录的记录吗?
标签: c# asp.net asp.net-mvc-3 linq