1

ResultValues というテーブルがあり、6 つの列があり、4 つは整数、1 つはデータタイム、1 つは varbinary (1640) です。

レコードの総数は「27,389,918」なので、このテーブルは非常に巨大です。このクエリを実行すると

select LineNo ,TraceNo, DateTime ,Bin from ResultValues
where ID = 8115
Order by DateTime ASC

UniqueID、ID、LineNo、TraceNo で NON Clustered Index を作成したところ、987014 が返されました。

質問: 非クラスター化インデックスの前と同じ時間がかかっています。このクエリを使用する時間を減らす方法を教えてください。提案してください。

4

2 に答える 2

2

にインデックスを作成するid, other columnsことはお勧めできません。

だけにインデックスを作成しますid。クエリ時間が大幅に改善されるはずです。

その理由は次の 2 点です。

  • id は一意であるため、インデックスに列を追加してもインデックス エントリは作成されないため、パフォーマンスや効率は向上しません。
  • インデックス エントリが大幅に小さくなるため、インデックスをより迅速にスキャンでき、クエリ時間が短縮されます。

このようなインデックスが「役立つ」のは、テーブルにアクセスせずにインデックスからすべてのデータを取得できるインデックスのみのクエリの場合のみです。ただし、これは非常に特殊な/ニッチなパフォーマンス手法であり、IMHO にはほとんど価値がありません。私は、非常に大規模な Web ベースの企業を含む多くの運用システムで働いてきましたが、そのようなインデックスが定義されているのを見たことがありません。それらはデータベースの維持に非常にコストがかかり、通常は良いことよりもはるかに多くの害をもたらし、良いことは最小限です。

于 2013-06-10T09:35:25.160 に答える
2
CREATE NONCLUSTERED INDEX ix_id_DateTime__LineNo_TraceNo_Bin 
ON (ID, DateTime)  INCLUDE (LineNo ,TraceNo, Bin)

これは、特定のクエリのカバリング インデックスである必要があります。これにより、最良の結果が得られるはずです。

于 2013-06-10T09:48:57.927 に答える