[解決済み] Entity Frameworkのクエリは遅いが、SqlQueryの同じSQLは速い。
2022-11-07 03:08:51
質問
.NET フレームワーク バージョン 4 で Entity Framework Code-First を使用した非常に単純なクエリに関連して、いくつかの本当に奇妙な現象が発生しています。LINQ2Entities クエリは次のようなものです。
context.MyTables.Where(m => m.SomeStringProp == stringVar);
これは実行に3000ミリ秒以上かかります。生成されたSQLは非常にシンプルに見えます。
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'
このクエリは、Management Studio で実行すると、ほとんど瞬時に実行されます。SqlQuery 関数を使用するように C# コードを変更すると、5 ~ 10 ミリ秒で実行されます。
context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);
つまり、全く同じSQLで、結果のエンティティはどちらも変更追跡されていますが、両者の間に野生の完全な違いがあります。どうしたのでしょうか?
どのように解決するのですか?
発見しました。SQLのデータ型の問題であることがわかりました。その
SomeStringProp
カラムはvarcharでしたが、EFは.NET文字列型がnvarcharであると仮定しています。その結果、DBが比較を行うためのクエリ中の変換処理に時間がかかっているのです。私はEF Profがここで私を少し迷わせたと思います、実行されるクエリのより正確な表現は次のようになります。
SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = N'1234567890'
従って、結果として得られる修正は、コード・ファースト・モデルに正しいSQLデータ型を示すアノテーションを付けることです。
public class MyTable
{
...
[Column(TypeName="varchar")]
public string SomeStringProp { get; set; }
...
}
関連
-
[解決済み] 不変量名 'System.Data.SqlClient' を持つ ADO.NET プロバイダに対応する Entity Framework プロバイダが見つかりませんでした。
-
[解決済み] Entity FrameworkとLINQ to SQLの比較
-
[解決済み] Entity Frameworkにおける最速の挿入方法
-
[解決済み] Entity Frameworkで生成されたSQLを表示するにはどうすればよいですか?
-
[解決済み】SQL Server。クエリーは高速ですが、プロシージャから遅い
-
[解決済み] Entity Frameworkの非同期処理には10倍の時間がかかる
-
[解決済み] forループの中で<と<=のどちらを使うべきか [閉じた状態].
-
[解決済み] CUDAカーネルのグリッドとブロックの寸法はどのように選択するのですか?
-
[解決済み] ファイルキャッシュをクリアしてパフォーマンステストを繰り返す
-
[解決済み] OFFSET / FETCH NEXTからの総行数取得
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン