0

私は SQLServer にかなり慣れていませんが、本当に気になることが 1 つあります。誰かが私に何が起こったのか説明してくれることを願っています。

インデックス作成プロセス中にアクティビティ モニターを実行したところ、脆弱なエンティティを含む一部のクエリに予想よりも時間がかかり、さらに奇妙なことに、SQLServer がフォームの脆弱なエンティティにインデックスを作成することを推奨していることに気付きました。

CREATE NONCLUSTERED INDEX [<INDEXNAME>]
ON [dbo].[<TABLE>] ([<ID1>])
INCLUDE ([<ID2>])
GO

そうすることで (実際には両方の列にインデックスを付けましたが、結果はほとんど同じだと思います)、クエリの速度が本当に向上しました (少なくとも、アクティビティ モニターで確認できることから)。

CREATE UNIQUE NONCLUSTERED INDEX [<INDEXNAME>] ON [dbo].[<TABLE>] 
(
    [<ID1>] ASC,
    [<ID2>] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

私の質問は次のとおりです。SQLServer はクラスター化インデックスを無視しますか? はいの場合、なぜですか? どうにかしてそれを修正できますか?実際には主キー インデックスとまったく同じ内容を持つはずの別のインデックスを追加するのは、かなり奇妙に思えます。

4

1 に答える 1

2

さまざまな理由が考えられます。明確にするために、クラスター化インデックスの定義を示してください。

クラスター化インデックスが ID2、ID1 にあり、クエリで両方の列を選択しているが、where 句で ID1 を使用している場合、この新しい非クラスター化インデックスがより高速に動作することは理にかなっています。

非クラスター化インデックスが 1 つの列にしかなく、2 つの列を選択している場合は、データを検索するためにクラスター化インデックスに移動する必要があります。データページに触れなければならないSQLサーバー。

一方、クラスター化インデックスが同じ順序である場合は、次のいずれかになります。

  1. クラスター化インデックスの FILL FACTOR - FILL FACTOR が低い場合、データは必要以上のデータ ページに分散され、より密集した非クラスター化インデックスからの読み取りよりも遅くなる可能性があります。
  2. クラスター化インデックスが配置されているファイル グループ (および最終的にはディスク) - 異なる場合、クエリ オプティマイザーは、クラスター化インデックス ディスク上で高い競合または遅いシーク速度を識別している可能性があります。
  3. シーケンシャル データをクラスター化インデックスに挿入していて、クラスター化インデックスの b-tree が偏っている
  4. テーブルに多くの挿入が発生したため、多くのページ分割が発生し、クラスター化インデックスでデータが物理的な順序になっていない
  5. クラスター化インデックスは一意ではありません。この場合、SQL サーバーはクラスター化インデックスに一意化子を追加して、クラスター化インデックスを大きくするため、同等の非クラスター化インデックスよりも多くのデータを読み取るため、速度が低下します。
  6. クラスター化インデックスは 1 列のみです (以下を参照)

クラスター化されたインデックスが 1 つの列 (ID1 など) にある場合、インデックス データはインデックスへの 2 つの論理読み取りですが、ID2 列のデータは 3 つの読み取り深さのインデックスのリーフにあります。

同等の非クラスター化インデックスの場合、データ ページにアクセスする必要がないため、2 つの論理読み取りのみが必要になります。つまり、非クラスター化インデックスは 1/3 高速になります。

クラスター化インデックスと非クラスター化インデックスがどのように格納されているかを確認してください。

クラスタ化インデックス構造

クラスター化されていないインデックス構造

どっちだったか教えて!

于 2012-11-22T00:17:03.157 に答える