2

ここでSQLServerの達人からのアドバイスをいただければ幸いです。説明させてください...

21列のSQLServer2008データベーステーブルがあります。それらの簡単なタイプは次のとおりです。

  • INT主キー
  • すでにインデックスになっている他のいくつかのINT(このテーブルや他のテーブルを参照するために使用されます)
  • ユーザー提供のテキストを保持するためのいくつかのNVARCHAR(64)
  • より長いユーザー提供のテキストを保持するためのいくつかのNVARCHAR(256)
  • いくつかのDATETIME2
  • 1つのBIGINT
  • いくつかのUNIQUEIDENTIFIER、1つはすでにインデックスです

このテーブルの使用方法は、並べ替え可能なテーブルとしてユーザーに表示され、ユーザーは並べ替える列を選択できることです。このテーブルには、何千ものレコードが含まれている可能性があります(現在、21,000のレコードがあり、今後も増える予定です)。

だから私の質問は、より高速な並べ替えを可能にするために、各列をINDEXとして設定する必要がありますか?

PS。言うのを忘れた。出力は明らかにページネーションをサポートしているため、ユーザーには一度に100行しか表示されません。

4

3 に答える 3

3

一般に信じられていることとは異なり、列にインデックスを付けるだけでは、クエリが高速になるとは限りません。

そのテーブルから常に使用している場合SELECT *..、単一の列にあるこれらの非クラスター化インデックスは、ほとんど使用されない可能性があります。

優れた非クラスター化インデックスはカバーリングインデックスです。つまり、1つまたは複数の指定されたクエリを満たすために必要なすべての列が含まれています。このような状況では、非クラスター化インデックスが理にかなっている可能性があります。そうでない場合、多くの場合、非クラスター化インデックスはクエリオプティマイザーによって無視される可能性があります。この理由は次のとおりです。とにかくすべての列が必要な場合、クエリは、非クラスター化インデックスから、見つかった各行の実際のデータ(クラスター化インデックス)へのキールックアップを実行する必要があります。キールックアップは非常にコストのかかる操作です。そのため、多くのヒットに対してこれを行うと、コストがかかりすぎ、クエリオプティマイザーはデータをフェッチするためにインデックススキャン(場合によってはクラスター化インデックススキャン)にかなり迅速に切り替えます。

過剰なインデックスを作成しないでください-適切に設計されたクラスター化インデックスを使用し、外部キー列にインデックスを配置して結合を高速化します-そして当面はそのままにしておきます。システムを観察し、パフォーマンスを測定し、ここそこにインデックスを追加します。ただし、システムに大量のインデックスを追加するだけではいけません。

インデックスが多すぎると、インデックスがないよりも悪くなる可能性があります。たとえば、ステートメントごとINSERTに更新するなど、すべてのインデックスを維持する必要があります。これには時間がかかります。UPDATEDELETE

于 2012-04-08T07:21:48.590 に答える
2

このテーブルは...ソート可能なテーブルとしてユーザーに提示されます...[それは]何千ものレコードを含む可能性があります

表示用に何千ものレコードを注文している場合、それは間違っています。一般的なユーザーは、最大で約500の一般的なレコードを合理的に処理できます。例外的なユーザーは数千を処理できます。それ以上のことで、ユーザーが代表的なサンプルを見たという誤った感覚にユーザーを誤解させています。その結果、意思決定が不十分になり、ユーザーワークフローが非効率になります。代わりに、優れた検索アルゴリズムに焦点を当てる必要があります。

ここで覚えておくべきもう1つの点は、インデックスが多いほど、挿入と更新が遅くなることを意味します。それはバランスをとる行為です。SQL Serverは、実際に実行するクエリと並べ替えに関する統計を保持し、それらの統計を利用できるようにします。実行できるクエリがあり、SQLServerが使用できると考えているインデックスを正確に示します。ソートインデックスなしでデプロイし、その方法で1〜2週間実行します。次に、データを見て、ユーザーが実際に並べ替えたものを確認し、それらの列だけにインデックスを付けます。

不足しているインデックスの検索の例と概要については、次のリンクを参照してください:
http ://sqlserverpedia.com/wiki/Find_Missing_Indexes

于 2012-04-08T05:41:20.307 に答える
0

一般に、インデックスはWHERE条件を加速するために使用されます(場合によってはJOINS)。PRIMARY KEYしたがって、ソートを高速化する以外は、列にインデックスを作成することは考えていません。クライアント(winフォームまたはwpfを使用している場合)またはWebシナリオのデータベースで並べ替えを行うことができます

幸運を

于 2012-04-08T05:03:22.280 に答える