2012-02-28 14 views
2

実行計画が私が提供するDateTimeパラメータに依存するSQLクエリがあります。SQL Server 2008:実行計画は日付パラメータに依存します

WHERE Date > '2012-02-28' AND Date < '2012-01-01' 

何の結果が返されませんので、実行計画だけで、定数の評価になります:私は、私のような条件を持っている場合ことを理解しています。しかし、他のケースでは私には意味をなさない実行計画が異なります。たとえば、条件:

WHERE Date >= '2012-02-01 00:00:00' AND Date <= '2012-02-02 22:00:00' 

クエリは、追加したインデックスを使用して最適化されています。しかし、条件を次のように変更した場合:

WHERE Date >= '2012-02-27 00:00:00' AND Date <= '2012-02-27 22:00:00' 

インデックスをもう使用しません。

クエリを実行する前に、このテーブルのすべてのインデックスを再構築しました。私はこれで論理を見つけることができません。だから私の質問です:DateTimeパラメータはどのような実行計画にクエリに選択される影響を与えることができますか?

編集:明らかに、理由は、SQL Serverを混乱させるDateのインデックスのみが追加されていたためです。そのインデックスを削除した後、すべてが期待通りに機能しました。しかし、アイデアをありがとう。私はあなたがそれを理解するのに十分な詳細を提供しませんでした。インデックスが多すぎると決して良いことはありません!

答えて

1

SQL Serverは、テーブルの内容に関する統計情報を保持し、それらの統計に基づいてクエリプランを構築します。

たとえば、 100万レコードのテーブルがあり、2012年2月27日から2012-02-28の間に900.000レコードがある場合、クエリガバナーはデータを読み取るためにテーブルスキャンを行います。データの10%に2つの値の間に日付がある場合は、作成したインデックスを使用することをお勧めします。

統計モデルの1つの問題は、「古い統計」の問題です。 SQL Serverは、テーブルの一定割合以上、または500以上のレコード+(データカーディナリティの20%)が変更されたときはいつでも、「自動更新統計」を実行します。 (see this article)。

統計情報が古くなっている場合、SQL Serverは誤ったクエリプランを思い付くことがあります。

1

インデックスがフィルタリングされている可能性がありますが、特定のクエリでのみ使用されます。あなたはそれ以外の場合は、あなたのテーブルには、パーティション化される可能性があります。この

http://blog.sqlauthority.com/2008/09/01/sql-server-2008-introduction-to-filtered-index-improve-performance-with-filtered-index/

を決定するためにインデックス定義を見ることができますか?

これらのいずれも役立たない場合は、私はさらに詳しい情報を必要とします。

+0

アイデアのおかげで(私はフィルタリングされたインデックスが存在することも知らなかった)。索引はフィルター処理されず、表は区画化されません。クエリプランは統計に依存しているようです。 –

関連する問題