Warum generiert das Entitätsframework verschachtelte SQL-Abfragen?Warum generiert das Entitätsframework verschachtelte SQL-Abfragen?
Ich habe diesen Code
var db = new Context();
var result = db.Network.Where(x => x.ServerID == serverId)
.OrderBy(x=> x.StartTime)
.Take(limit);
Welche dies erzeugt! (Beachte die Doppelauswahlanweisung)
SELECT
`Project1`.`Id`,
`Project1`.`ServerID`,
`Project1`.`EventId`,
`Project1`.`StartTime`
FROM (SELECT
`Extent1`.`Id`,
`Extent1`.`ServerID`,
`Extent1`.`EventId`,
`Extent1`.`StartTime`
FROM `Networkes` AS `Extent1`
WHERE `Extent1`.`ServerID` = @p__linq__0) AS `Project1`
ORDER BY
`Project1`.`StartTime` DESC LIMIT 5
Was soll ich ändern, damit es eine Auswahlerklärung ergibt? Ich benutze MySQL und Entity Framework mit Code First.
aktualisiert
Ich habe das gleiche Ergebnis unabhängig von der Art des Parameters auf die OrderBy()
Methode übergeben.
Update 2: Timed
Total Time (hh:mm:ss.ms) 05:34:13.000
Average Time (hh:mm:ss.ms) 25:42.000
Max Time (hh:mm:ss.ms) 51:54.000
Count 13
First Seen Nov 6, 12 19:48:19
Last Seen Nov 6, 12 20:40:22
Raw query:
SELECT `Project?`.`Id`, `Project?`.`ServerID`, `Project?`.`EventId`, `Project?`.`StartTime` FROM (SELECT `Extent?`.`Id`, `Extent?`.`ServerID`, `Extent?`.`EventId`, `Extent?`.`StartTime`, FROM `Network` AS `Extent?` WHERE `Extent?`.`ServerID` = ?) AS `Project?` ORDER BY `Project?`.`Starttime` DESC LIMIT ?
verwendete ich ein Programm Schnappschüsse aus dem aktuellen Prozess in MySQL zu übernehmen.
Andere Abfragen wurden zur gleichen Zeit ausgeführt, aber wenn ich sie in nur eine SELECT-Anweisung ändere, geht sie NIEMALS über eine Sekunde hinaus. Vielleicht habe ich noch etwas anderes vor; Ich frage, weil ich bin nicht so in DBs ...
Update 3: Die Anweisung explain
Das Entity Framework erzeugt
'1', 'PRIMARY', '<derived2>', 'ALL', NULL, NULL, NULL, NULL, '46', 'Using filesort'
'2', 'DERIVED', 'Extent?', 'ref', 'serveridneventid,serverid', 'serveridneventid', '109', '', '45', 'Using where'
One-Liner
'1', 'SIMPLE', 'network', 'ref', 'serveridneventid,serverid', 'serveridneventid', '109', 'const', '45', 'Using where; Using filesort'
Dies stammt aus meiner QA-Umgebung, daher bezieht sich das Timing, das ich oben eingefügt habe, nicht auf die rowcount EXPLAIN-Anweisungen. Ich denke, dass es etwa 500.000 Datensätze gibt, die mit einer Server-ID übereinstimmen.
Lösung
Ich wechselte von MySQL zu SQL Server. Ich möchte nicht die Anwendungsschicht komplett neu schreiben.
Zu allererst LINQ To SQL und Entity Framework sind verschiedene Dinge. Zweitens, warum denkst du, diese Abfrage ist schlecht? Hast du Performance-Analysen durchgeführt oder zumindest erklärt? – Stilgar
Ja, ich erstelle sie manuell in reinem SQL. Mit 28 Millionen Datensätzen gibt es Millisekunden vs Minuten –
Sorry für den Tippfehler mit Linq To SQL –