1. ホーム
  2. sql

テーブルスキャンとクラスター化インデックススキャンの違いは何ですか?

2023-09-30 04:25:33

質問

というのは Table ScanClustered Index Scan は基本的にテーブル内のすべてのレコードをスキャンしますが、なぜクラスタ化インデックススキャンの方が良いとされているのでしょうか?

例として、多くのレコードがある場合、以下のパフォーマンスの違いは何ですか?

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

どのように解決するのですか?

クラスタ化インデックスのないテーブル (ヒープ テーブル) では、データ ページは互いにリンクされていません - そのため、ページをたどるには インデックス アロケーション マップへのルックアップが必要です。 .

しかし、クラスタ化されたテーブルには データページが二重リンクリストにリンクされ - でリンクされており、シーケンシャルスキャンが少し速くなります。もちろん、それと引き換えに、データページを INSERT , UPDATE そして DELETE . しかし、ヒープテーブルは、IAMへの2回目の書き込みが必要です。

もしあなたのクエリが RANGE 演算子(例. SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100 ) の場合、クラスタ化されたテーブル (順序が保証されている) の方が効率的でしょう - なぜなら、インデックスページを使用して関連するデータページを見つけることができるからです。ヒープでは、順序に依存できないため、すべての行をスキャンする必要があります。

そしてもちろん、クラスタ化されたインデックスはCLUSTERED INDEX SEEKを行うことができ、これはパフォーマンスにとってかなり最適です...インデックスを持たないヒープは常にテーブルスキャンを行うことになります。

というわけで。

  • すべての行を選択する例のクエリでは、唯一の違いはクラスタ化インデックスが保持する二重リンクリストです。これにより、クラスタ化されたテーブルは、多数の行を持つヒープよりもほんの少し速くなるはずです。

  • を持つクエリに対して WHERE 句を持つクエリでは、クラスタ化インデックスによって(少なくとも部分的に)満たされるため、テーブル全体をスキャンする必要がなく、順序付けによって優位に立つことができます。

  • クラスタ化インデックスによって満たされないクエリでは、ほぼ互角です。唯一の違いは、順次走査のための二重リンクされたリストがあることです。どちらの場合でも、最適とは言えません。

  • については INSERT , UPDATE そして DELETE で、ヒープが勝つかもしれないし、勝てないかもしれない。ヒープは順序を維持する必要はありませんが、IAMへの2回目の書き込みが必要です。相対的なパフォーマンスの違いはごくわずかだと思いますが、かなりデータに依存します。

マイクロソフトは ホワイトペーパー で、ヒープ上のクラスタ化インデックスと同等の非クラスタ化インデックスを比較しています(私が上記で説明したものと全く同じではありませんが、近いです)。彼らの結論は、基本的にすべてのテーブルにクラスタ化インデックスを配置することです。彼らの結果を要約するために最善を尽くします(ここでも、彼らは実際には非クラスタ化インデックスとクラスタ化インデックスを比較していることに注意してください - しかし、私はそれが比較的同等だと思います)。

  • INSERT パフォーマンス: ヒープに必要な 2 番目の書き込みにより、クラスタ化されたインデックスが約 3% 優れています。
  • UPDATE パフォーマンス: ヒープに必要な 2 番目のルックアップにより、クラスタ化されたインデックスが約 8% 優位になります。
  • DELETE パフォーマンス: クラスタ化されたインデックスは、ヒープのために IAM から必要とされる 2 番目のルックアップと 2 番目の削除により、約 18% の差で勝利します。
  • シングル SELECT パフォーマンス: ヒープに必要な 2 番目のルックアップにより、クラスタ化されたインデックスが約 16% 優れています。
  • 範囲 SELECT パフォーマンス: クラスタ化されたインデックスは、ヒープに対するランダムな順序付けにより、約29%勝っています。
  • 同時並行 INSERT : ヒープ テーブルは、クラスタ化インデックスのページ分割により、負荷がかかると 30% 勝つことができます。