107

.NET Framework バージョン 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、結果のエンティティはどちらの場合も変更追跡されますが、2 つの間のパフォーマンスの大きな違いです。何を与える?

4

6 に答える 6

116

それを見つけた。これは 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; }

    ...
}
于 2013-04-02T19:39:05.030 に答える
12

流暢なマッピングを使用している場合IsUnicode(false)は、構成の一部として使用して同じ効果を得ることができます -

http://msdn.microsoft.com/en-us/data/jj591617.aspx#1.9

http://msdn.microsoft.com/en-us/library/gg696416%28v=vs.103%29.aspx

于 2013-07-10T10:38:19.900 に答える
4

私は同じ問題を抱えていました (SQL マネージャーから実行するとクエリが高速になります) が、EF から実行するとタイムアウトが発生します。

エンティティ (ビューから作成されたもの) のエンティティ キーが間違っていることが判明しました。そのため、エンティティには同じキーを持つ重複した行があり、バックグラウンドでグループ化する必要があったと思います.

于 2013-04-12T18:01:28.260 に答える