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.
Können Sie überprüfen, welche Querys auf dem Server ausgeführt wurden? (In welchen Querys wird das übersetzt) –
@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
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. –