2012-03-09 8 views
3

私はLinq ExecuteQueryメソッドを使用して2つのクエリは非常にsimilarsを持って、Linqのパフォーマンス:2つのクエリ、すぐに最初の応答と2番目の非常に遅い

Microsoft SQL Server Management Studioでもクエリを実行し、2つのクエリの応答時間は0秒です。

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
    "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB WHERE id_tank = {0} AND date <= {1}  order by date desc", 
    new object[] { tankId, date }); 

注1(低速)

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
    "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB WHERE id_tank = {0} AND date >= {1} order by date", 
    new object[] { tankId, date }); 

クエリ2(高速)クエリ1:ViewDataTanksDataDevicesSBスキーマ結合を有する図であり、それは2つの索引

を有します
  1. インデックス1(id_tank、date asc)
  2. インデックス2(id_tank、日付DESC)

注2:私は最初の2番目のクエリを実行すると結果は同じです:Query1を遅くし、クエリ2速いです。

注3:ビューには数百万のレジスタがあり、その結果は日付とタンクによって異なります。

+0

実行計画はあなたに何を伝えますか? –

+0

クエリ2を最初に実行し、クエリ1を最後に実行するとどうなりますか? –

+2

コードからのクエリと実行計画の両方を実行しているときに、SQL Serverのプロファイラツールを調べることを検討することもできます。インデックス問題(ASC対DESC)のような臭いがあります – Krumelur

答えて

3

私は実行計画(提案によって感謝ヤヒア)を見、一週間後にそれを解決しました! 2つのクエリで

は私が指定したINDEX(感謝デニス)と私はヒントNOEXPANDを指定する必要がありました。

NOEXPAND説明で発見することができます:Table hints

だから、最後のクエリは、次のとおりです。

クエリ1

​​

クエリ2

IEnumerable<ViewDataTanksDataDevice> res= 
this.ExecuteQuery<ViewDataTanksDataDevice>(
    "SELECT TOP 1 * FROM ViewDataTanksDataDevicesSB with (index(IX_ViewDataTanksDataDevicesSB_TankIdDate) noexpand) WHERE id_tank = {0} AND date <= {1} order by date desc", 
    new object[] { tankId, date }); 
1

などのクエリ・プランの比較がなければ、これは答えるのは難しいです...

しかし、あなたの説明から、それはSSMSで実行した場合、両方のクエリが高速で、フロン実行したときにそれらの一つが遅いようです。 NET - そのような異なる動作の理由は、DBセッションに使用される設定にある可能性があります.SMSには、ADO.NET(LINQが使用するもの)で使用されるデフォルトと異なる既定値があります。これに関する特定の状況を解決する方法に関するいくつかのヒントを含む非常に詳細な説明は、hereで見つけることができます。

詳しくは、こちらをご覧ください。より具体的なヘルプを得るためのクエリプラン...

0

クエリの最後にoption(recompile)を追加してみてください。

更新

あなたのインデックス1とインデックス2は、あなたがそれらのいずれかを削除することができ、ほとんど同じです。インデックスがそうのようなテーブルの上にwith(index(ix_index1))オプションで使用するエンジンを暗示することも可能である:

SELECT TOP 1 * 
FROM ViewDataTanksDataDevicesSB with(index(ix_index1)) 
WHERE id_tank = 123 AND date <= '20120313' 
order by date desc 
+0

はい...私は再コンパイルし、実行計画キャッシュもクリアしました。 –

0

MS SQL Server Profilerからより多くの情報を提供できますか? MS SQL Server側かCLR側かを判断するには、クエリプランが優先されます。

関連する問題