3

Linq ExecuteQuery メソッドを使用すると、最初のクエリは 30 秒かかり、2 番目のクエリはすぐに実行されます。

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

クエリ 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 (高速)

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: ViewDataTanksDataDevicesSB は SCHEMA BINDING を使用したビューであり、2 つのインデックスがあります。

  1. インデックス 1(id​​_tank、日付 asc)
  2. インデックス 2(id_tank, date desc)

注 2: 最初に 2 番目のクエリを実行すると、結果は同じになります。クエリ 1 は遅く、クエリ 2 は高速です。

注 3: ビューには数百万のレジスタがあり、日付やタンクが異なっても結果は同じです。

4

4 に答える 4

3

実行計画を見て、1週間後に解決しました(提案によるYahiaに感謝します)!!!

2 つのクエリでINDEXを指定し(Denis に感謝)、ヒントNOEXPANDを指定する必要がありました。

NOEXPAND の説明は次の場所にあります:テーブル ヒント

したがって、最終的なクエリは次のとおりです。

クエリ 1

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", 
   new object[] { tankId, date });

クエリ 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 });
于 2012-03-14T17:38:53.423 に答える
1

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

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

詳細を投稿してください。より具体的なヘルプを取得するためのクエリ プラン...

于 2012-03-13T08:29:59.787 に答える
0

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

于 2012-03-18T21:43:51.853 に答える
0

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

アップデート

インデックス1とインデックス2はほぼ同じであり、いずれか1つを削除できます。with(index(ix_index1))次のように、テーブルのオプションで使用するインデックスをエンジンにヒントすることもできます。

SELECT TOP 1 * 
FROM ViewDataTanksDataDevicesSB with(index(ix_index1))
WHERE id_tank = 123 AND date <= '20120313'
order by date desc
于 2012-03-13T08:42:54.150 に答える