2013-03-14 7 views
6

Ich habe eine Linq To Sql query (or with brackets) hier, die auf meinem lokalen SQL2008 funktioniert, in etwa 00: 00: 00s - 00: 00: 01s, aber auf dem Remote-Server dauert es herum 00: 02: 10s. Es gibt etwa 56k Artikel in dbo.Movies, dbo.Boxarts und 300k in dbo.OmdbEntriesDbContext Timeout auf Remote-Server nur

{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} 

Die innere Abfrage zuerst nimmt alle zugehörigen Positionen in den Tabellen und erstellt dann ein neues Objekt, dann von diesem Objekt, finde nur die t_Meter s, die nicht null sind. Dann von diesen t_Meter s, wählen Sie nur die einzelnen Elemente und sortieren Sie sie dann, um eine Liste von 98 oder so ints zurückgeben.

Ich weiß nicht genug über SQL-Datenbanken noch nicht oder nicht intuitiv zu wissen, ob das ist eine extreme Reihe von DB-Aufrufe in eine einzelne Abfrage, aber da es nur eine Sekunde oder weniger auf meinem lokalen Server dauert Ich dachte es wäre in Ordnung.


edit: Hier ist der LINQ-Code, den ich eigentlich gar nicht aufgeräumt: http://pastebin.com/JUkdjHDJ Es ist chaotisch, aber es wird die Arbeit getan ... Das Update fand ich wurde ToArray nach OrderBy Aufruf, aber vor Distinct hat enorm geholfen. Anstatt also

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

Ich habe

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

Ich bin sicher, ich hatte die Linq-Code verbunden (und reinigte ihn nach oben) statt der automatisch generierten SQL-Abfrage, würden Sie diese Lage gewesen zu lösen leicht, tut mir leid.

+0

Können Sie überprüfen, welche Querys auf dem Server ausgeführt wurden? (In welchen Querys wird das übersetzt) ​​ –

+0

@GabrielMonteiroNepomuceno Ich verstehe nicht ganz, aber wenn Sie den Aktivitätsmonitor verwenden, kann ich aufgrund von Berechtigungen nicht darauf zugreifen. Meinst du, zeigen Sie die Linq To SQL, die diese Abfrage erstellt? – TankorSmash

+0

Wenn Sie Visual Studio Ultimate verwenden und Sie The Intelletrace öffnen, werden Sie dort alle Abfragen sehen, die in der Datenbank ausgeführt wurden. Wenn Sie Visual Studio Ultimate nicht haben, können Sie auf einfache Weise Profile in Ihrer lokalen Datenbank verwenden, um zu sehen, welche Anfragen an Ihre Anwendung gestellt werden. Ich denke, das Problem ist mit n + 1 Abfragen. –

Antwort

0

Hier ist der LINQ-Code, den ich eigentlich gar nicht aufgeräumt: http://pastebin.com/JUkdjHDJ Es ist chaotisch, aber es wird die Arbeit getan ... Das Update fand ich wurde ToArray nach OrderBy Aufruf, aber vor Distinct half immens heraus. Anstatt also

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

Ich habe

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

Ich denke, es funktioniert, weil es die Distinct nur gegen den Array im Speicher ausgeführt wird, anstatt das gesamte DB im Wert von Einträgen? Ich bin mir aber nicht wirklich sicher, da das alte LINQ einwandfrei auf meinem lokalen Server funktioniert.

Ich bin sicher, hatte ich den Linq-Code (und aufgeräumt) und nicht die automatisch generierte SQL-Abfrage, Sie hätten in der Lage, dies leicht zu lösen, entschuldigen Sie das.