2

SQL Server で Insert/Update/Delete ステートメントに使用する必要があるインデックスの種類 (クラスター化/非クラスター化)。追加のオーバーヘッドが発生することはわかっていますが、非クラスター化インデックスと比較してパフォーマンスが優れていますか? また、SQL Server の Select ステートメントにはどのインデックスを使用する必要がありますか?

4

2 に答える 2

7

何を期待しているのか100%確実ではありません-テーブルに持つことができるクラスタリングインデックスは1つだけであり、デフォルトでは、すべてのテーブル(エッジケースの例外はほとんどありません)に1つあるはずです。すべてのインデックスは通常、SELECTを最も助け、一部はINSERT、DELETE、場合によってはUPDATEを少し(または適切に選択されていない場合は多く)傷つける傾向があります。

クラスター化されたインデックスは、すべての操作でテーブルを高速化します。はい!します。背景情報については、 KimTrippの優れたClusteredIndexDebateが続きます。彼女はまた、クラスター化されたインデックスの主な基準についても言及しています。

  • 狭い
  • 静的(変更しない)
  • 個性的
  • 可能であれば:増え続ける

INTIDENTITYはこれを完全に満たします-GUIDはそうではありません。詳細な背景情報については、主キーとしてのGUIDを参照してください。

なぜ狭いのですか?クラスタリングキーは、同じテーブル上のすべての非クラスター化インデックスのすべてのインデックスページに追加されるためです(必要に応じて、データ行を実際に検索できるようにするため)。クラスタリングキーにVARCHAR(200)を含めたくない...。

なぜユニークなの?上記を参照してください-クラスタリングキーは、SQLServerがデータ行を一意に検索するために使用するアイテムとメカニズムです。それはユニークでなければなりません。一意でないクラスタリングキーを選択すると、SQLServer自体が4バイトの一意化子をキーに追加します。気をつけて!

次へ:非クラスター化インデックス。基本的に1つのルールがあります。別のテーブルを参照する子テーブル内の外部キーにはインデックスを付ける必要があります。これにより、JOINやその他の操作が高速化されます。

さらに、WHERE句を含むクエリは、適切な候補です。最初に頻繁に実行されるクエリを選択してください。WHERE句に表示される列のORDERBYステートメントにインデックスを付けます。

次へ:システムを測定し、DMV(動的管理ビュー)で未使用または欠落しているインデックスに関するヒントを確認し、システムを何度も微調整します。それは進行中のプロセスです、あなたは決して終わらないでしょう!

警告のもう1つの言葉:大量のインデックスを使用すると、SELECTクエリを非常に高速に実行できます。ただし、同時に、関連するすべてのインデックスを更新する必要があるINSERT、UPDATE、およびDELETEが影響を受ける可能性があります。選択するだけの場合は、気を付けてください。そうでなければ、それは細かく繊細なバランスを取る行為です。信じられないほど単一のクエリをいつでも微調整できますが、システムの他の部分はそうすることで苦しむ可能性があります。データベースのインデックスを作成しすぎないでください。いくつかの適切なインデックスを設定し、システムの動作を確認して観察し、さらに1つまたは2つ追加して、システム全体のパフォーマンスがそれによってどのように影響を受けるかを観察します。

于 2010-04-23T20:31:51.053 に答える
3

「Insert/Update / Deleteステートメントに使用する必要がある」とはどういう意味かよくわかりませんが、私の意見では、すべてのテーブルにクラスター化インデックスが必要です。クラスタ化インデックスは、データが実際に保存される順序を指定します。クラスタ化されたインデックスが定義されていない場合、データは単にヒープに格納されます。クラスタ化インデックスとして機能する自然な列がない場合は、いつでもこのようなintまたはbigintとしてID列を作成できます。

CREATE TABLE [dbo].[demo](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nchar](10) NULL,
[LastName] [nchar](10) NULL,
[Job] [nchar](10) NULL,
 CONSTRAINT [PK_demo] PRIMARY KEY CLUSTERED 
(
[ID] ASC
))
于 2010-04-23T20:29:40.840 に答える