クラスタ化インデックスのないテーブル(ヒープテーブル)では、データページは相互にリンクされていないため、ページをトラバースするには、インデックス割り当てマップを検索する必要があります。
ただし、クラスター化されたテーブルでは、データページが二重にリンクされたリストにリンクされているため、シーケンシャルスキャンが少し高速になります。もちろん、その代わりに、、、、およびでデータページを順番に保持するためのオーバーヘッドがINSERT
ありUPDATE
ますDELETE
。ただし、ヒープテーブルにはIAMへの2回目の書き込みが必要です。
クエリにRANGE
演算子(例:)がある場合SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100
、クラスター化されたテーブル(順序が保証されている)の方が効率的です。インデックスページを使用して関連するデータページを見つけることができるためです。ヒープは順序付けに依存できないため、すべての行をスキャンする必要があります。
そしてもちろん、クラスター化インデックスを使用すると、クラスター化インデックスシークを実行できます。これは、パフォーマンスに非常に最適です...インデックスのないヒープは、常にテーブルスキャンになります。
それで:
すべての行を選択するクエリの例では、唯一の違いは、クラスター化インデックスが維持する二重リンクリストです。これにより、クラスター化されたテーブルは、行数が多いヒープよりもほんの少し速くなります。
クラスタ化インデックスによって(少なくとも部分的に)満たすことができる句を含むクエリのWHERE
場合、順序付けのために先に出てくるので、テーブル全体をスキャンする必要はありません。
クラスター化インデックスで満たされないクエリの場合、ほぼ均等です...繰り返しますが、唯一の違いは、順次スキャン用の二重リンクリストです。どちらの場合も、あなたは最適ではありません。
、、およびヒープの場合、勝つかどうかはわかりませんINSERT
。ヒープは順序を維持する必要はありませんが、IAMへの2回目の書き込みが必要です。相対的なパフォーマンスの違いはごくわずかだと思いますが、データにもかなり依存します。UPDATE
DELETE
Microsoftには、クラスター化されたインデックスをヒープ上の同等の非クラスター化インデックスと比較するホワイトペーパーがあります(上記で説明したものとまったく同じではありませんが、近いです)。彼らの結論は、基本的にすべてのテーブルにクラスター化インデックスを配置することです。結果を要約するために最善を尽くします(ここでも、非クラスター化インデックスをクラスター化インデックスと実際に比較していることに注意してください。ただし、比較的比較可能だと思います)。
INSERT
パフォーマンス:ヒープに必要な2回目の書き込みにより、クラスター化インデックスは約3%勝ちます。
UPDATE
パフォーマンス:ヒープに必要な2回目のルックアップにより、クラスター化インデックスは約8%勝ちます。
DELETE
パフォーマンス:ヒープのIAMからの2回目のルックアップと2回目の削除が必要なため、クラスター化されたインデックスは約18%勝ちます。
- 単一の
SELECT
パフォーマンス:ヒープに必要な2回目のルックアップにより、クラスター化されたインデックスは約16%勝ちます。
- 範囲の
SELECT
パフォーマンス:ヒープのランダムな順序により、クラスター化されたインデックスが約29%勝ちます。
- 同時実行
INSERT
:クラスター化インデックスのページ分割により、負荷がかかった状態でヒープテーブルが30%勝ちます。