2013-03-14 2 views
6

У меня есть Linq To Sql query (or with brackets) здесь, который работает на моем локальном SQL2008, примерно с 00:00 до 00:00 - 00: 00: 01, но на удаленном сервере он занимает около 00: 02: 10s. Там же около 56k элементов в dbo.Movies, dbo.Boxarts и 300k в 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} 

Внутренний запрос первым принимает все соответствующие элементы в таблицах, а затем создает новый объект, то из этого объекта, найти только t_Meter s, которые не являются нулевыми. Затем из этих t_Meter s выберите только отдельные элементы, а затем отсортируйте их, чтобы вернуть список из 98 или около того ints.

До сих пор я недостаточно знаю о SQL-базах данных, чтобы интуитивно узнать, действительно ли это экстремальный набор вызовов db для ввода одного запроса, но поскольку на моем локальном сервере он занимает всего несколько секунд или меньше , Я подумал, что все в порядке.


редактировать: Вот код LINQ, что я на самом деле не очищены вообще: http://pastebin.com/JUkdjHDJ Это грязно, но он получает работу ... Исправление я нашел звала ToArray после OrderBy, но до Distinct очень помогли. Таким образом, вместо

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

Я сделал

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

Я уверен, что если бы я связал код Linq (и очищать его), а не сгенерированный запрос SQL, вы смогли бы решить эту проблему легко, извините за что.

+0

Не могли бы вы проверить, какие запросы были выполнены на сервере? (в каких запросах это переводится) –

+0

@GabrielMonteiroNepomuceno Я не совсем понимаю, но если вы имеете в виду использование Activity Monitor, я не могу получить к нему доступ из-за разрешений. Вы имеете в виду показать вам Linq To SQL, который создал этот запрос? – TankorSmash

+0

Если вы используете Visual Studio Ultimate, и вы открываете Интеллект, и вы увидите там все запросы, которые были включены снова в вашу базу данных. Если у вас нет визуальной студийной ступени, вам будет проще использовать профили в своей локальной базе данных, чтобы узнать, какие запросы вы делаете. Я думаю, проблема связана с n + 1 запросами. –

ответ

0

Вот код LINQ, что я на самом деле не очищен вообще: http://pastebin.com/JUkdjHDJ Это грязно, но он получает работу ... Исправление я нашел звало ToArray после OrderBy, но до Distinct помог очень. Таким образом, вместо

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

Я

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

Я предполагаю, что это работает, потому что он работает на Distinct только против массива в памяти, а не всю сумму децибел записей? Я не уверен, хотя, поскольку старый LINQ работает безупречно на моем локальном сервере.

Я уверен, что связал код Linq (и очистил его), а не автогенерированный SQL-запрос, вы бы легко смогли это решить, сожалея об этом.

Смежные вопросы