Entity Framework がネストされた SQL クエリを生成するのはなぜですか?
私はこのコードを持っています
var db = new Context();
var result = db.Network.Where(x => x.ServerID == serverId)
.OrderBy(x=> x.StartTime)
.Take(limit);
これを生成するもの!(二重選択ステートメントに注意してください)
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
1 つの select ステートメントになるようにするには、何を変更すればよいですか? Code First で MySQL と Entity Framework を使用しています。
アップデート
メソッドに渡されるパラメーターのタイプに関係なく、同じ結果が得られますOrderBy()
。
更新 2: 時限
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
生のクエリ:
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 ?
プログラムを使用して、MySQL の現在のプロセスからスナップショットを取得しました。
他のクエリは同時に実行されましたが、1 つの SELECT ステートメントに変更すると、1 秒を超えることはありません。多分私は何か他のことが起こっています。私はDBにあまり興味がないので聞いています...
更新 3: Explain ステートメント
生成された Entity Framework
'1', 'PRIMARY', '<derived2>', 'ALL', NULL, NULL, NULL, NULL, '46', 'Using filesort'
'2', 'DERIVED', 'Extent?', 'ref', 'serveridneventid,serverid', 'serveridneventid', '109', '', '45', 'Using where'
一発ギャグ
'1', 'SIMPLE', 'network', 'ref', 'serveridneventid,serverid', 'serveridneventid', '109', 'const', '45', 'Using where; Using filesort'
これは私の QA 環境からのものなので、上に貼り付けたタイミングは行数の Explain ステートメントとは関係ありません。1 つのサーバー ID に一致するレコードは 50 万件程度あると思います。
解決
MySQL から SQL Server に切り替えました。アプリケーション層を完全に書き直すことはしたくありません。