MySQL .NET コネクタ 6.6.5 を使用して、MySQL データベースに対して C# .NET アプリケーションで Entity Framework 5 を実行しています。
通常、EF が十分に高速でない場合、ストアド プロシージャまたは SQL の直接実行に頼ります。context.Database.SqlQuery
ただし、最近、SQL 呼び出しが実際には EF の同等の処理よりもはるかに長い時間がかかるという問題がありました。 ?
(遅い)SQLクエリは次のとおりです。
public sbyte? getFirstRouteTypeFromStop(string primaryCode) {
string sql = string.Format("SELECT r.route_type FROM stoptimes st INNER JOIN trips t ON st.trip_id = t.trip_id INNER JOIN routes r ON t.route_id = r.route_id WHERE st.stop_id = '{0}' LIMIT 1;", primaryCode);
return context.Database.SqlQuery<sbyte?>(sql).FirstOrDefault();
}
(高速)EFコードは次のとおりです。
public sbyte? getFirstRouteTypeFromStop(string primaryCode) {
return context.stoptimes.Where(st => st.stop_id.Equals(primaryCode)).FirstOrDefault().trip.route.route_type;
}
このメソッドはループ内で繰り返し呼び出され、EF の方がはるかに高速です。(少なくとも 1000%) なぜですか?
重要事項:
- MySQL データベースには、これらすべての列が適切にインデックス化されています。
- ネイティブ SQL クエリを MySQL で直接実行すると、C# アプリで実行した場合よりもはるかに高速に実行されるように見えます。これは非常に重要な観察結果であると思います。