3

テーブルには 2 億 7000 万のレコードがあります。現在、日付列に非クラスター化インデックスがあります。99% の時間で、2008 年 1 月 1 日を超える日付の行を使用しています。つまり、1 億 4,000 万行です。SQL Server 2008 を使用しています。この状況では、通常の非クラスター化インデックス以外にフィルター選択されたインデックスを使用すると効果的ですか?

また、「datetime」の代わりに「date」データ型を使用すると、どの程度有益ですか?

前もって感謝します !

4

2 に答える 2

4

はい、フィルター処理された非クラスター化インデックスは次の目的で使用されます。

  • 非常に少数のレコードをスキャンするよりもクエリ。持っていますWHERE date ='20101016'(270M から 1 日、いくつかのレコードを除外します)。
  • より大きな日付範囲をスキャンするよりもクエリを実行しますが、日付フィールドのみに触れます。SELECT COUNT(date) FROM ... WHERE date BETWEEN '20080101' AND '20090101'

そしてそれはそれについてです。より複雑なクエリでは、インデックスの転換点に達するため、フィルター処理されているかどうかに関係なく、非クラスター化インデックスは使用されませ

したがって、結論として、WHERE date > '200080101'句を持つこのテーブルの一般的なクエリの場合、提案されたフィルター処理された非クラスター化インデックスは役に立ちます...何もありません。さらに、dateクラスター化インデックスの左端のキーとして移動したとしても (これは、テーブルのように時間範囲クエリ時系列の典型的な編成であり、自分で検討する必要があります)、「のみ」140M を除外します。 270M はほとんど最適化ではありません。

適切な索引付けは複雑なトピックです。すべてのサブチャプターを含む、この MSDN リンクのすべてを読むことをお勧めします: Designing Indexes。これにより、いくつかのより複雑な記事を理解するための最小限の知識が得られ、そこにある大量の誤った情報をばかげたことから正しく識別することができます。

于 2010-10-16T16:12:36.513 に答える
1

はい、フィルタリングされたインデックスが役立つ可能性があります。1 億 4000 万行を取得するための「WHERE MyColumn IS NOT NULL」などの一般的なフィルターがある場合は、それがインデックスを作成する方法である可能性があります。インデックスは、基準に一致するキーを使用して構築されるため、インデックス データのセットがはるかに小さくなります。

大量のデータを扱う場合は、datetime (8 バイト ストレージ) よりも date キー (3 バイト ストレージ) の方が適している場合もあります。ただし、datetime データ型から得られる精度 (時間) が必要ない場合にのみ役立ちます。

于 2010-10-16T00:47:50.640 に答える