2016-10-26 8 views
0

パフォーマンスの問題を追跡しようとしています。私は、SQL Server Expressデータベースに対して次のSQLクエリを実行しています:EF SqlQuery問合せが直接問合せよりも20倍遅いのは正常ですか?

SELECT COUNT(OrderID) 
    FROM FutureOrderHeader 
WHERE ScheduledFulfillmentTime >= {0} 
    AND ScheduledFulfillmentTime < {1} 
    AND SplitStatus <> 2 
    AND Deleted = 0 
    AND OrderMode = {2} 

次のように私は、Entity Frameworkを使用してコマンドを実行すると:私は、コマンドを実行した場合

var results = ((DbContext)this._context).Database.SqlQuery<int>(SQL,start.BoxToSqlDataTime(),end.BoxToSqlDataTime(), (int)mode).Single(); 

それはその後、約20倍遅いですADO.NETを介して。 SQL Server ProfilerとEF Profilerを使用して、クエリが同じであると判断できました。 EFからこのクエリを実行します。 720回の平均時間は2837msです。ストレートADO.NETを使用して同じクエリを実行すると、平均146msかかります。

SQL Server Profilerでは、EFまたはADO.NETを使用しているかどうかにかかわらず、実行される実際のSQLテキスト、期間、CPU使用率、読み取り値などは同じです。 SQL Server Profilerによると、クエリ自体は、EFまたはまっすぐなADO.NETを使用しているかどうかにかかわらず、0msから2msの間にかかります。

このパフォーマンスヒットが正常かどうか、または何か不足しているのではないかと思っていました。

ありがとうございます!

+0

これは、おそらくEFモデルの起動時間です。同じコンテキストで2回目を実行すると、まだ遅いですか? –

+0

上記のテストを実行する前に、他のクエリを実行してEFの起動時間を計算しようとしました。 – user2141352

答えて

0

いいえ、私はそれが正常ではないと言います。 EFとLinq-to-SQLがうまくいっていないことがありますが、where句を使って単純なカウントを取得するだけでうまくいくはずです。

実際に何が実行されているかを見るには、コールでEFコールをプロファイリングすることをお勧めします。あなたが指定したEFコードクエリを見ると、同じクエリではないようです。その後、EFコードを変更したり、適切なインデックスを作成して、探しているパフォーマンスを得ることができます。

関連する問題