web-dev-qa-db-ja.com

SQLServerヒープv.s.クラスター化インデックス

SQL Server 2008を使用しています。テーブルにクラスター化インデックスがない場合はヒープと呼ばれ、ストレージモデルはクラスター化インデックス(Bツリー)と呼ばれます。

ヒープストレージの正確な意味、その外観、および「ヒープ」データ構造(最小ヒープ、最大ヒープなど)として編成されているかどうかについて詳しく知りたいです。推奨される読み物はありますか?私はもう少し内部を増やしたいのですが、あまり深くはありません。 :-)

よろしくお願いします、ジョージ

28
George2

ヒープストレージは これらのヒープ とは何の関係もありません。

ヒープとは、レコード自体が順序付けられていない(つまり、相互にリンクされていない)ことを意味します。

レコードを挿入すると、データベースが検出した空き領域にレコードが挿入されます。

ヒープベースのテーブルの行を更新しても、他のレコードには影響しません(ただし、セカンダリインデックスには影響します)。

HEAPテーブルにセカンダリインデックスを作成する場合、RID(ストレージスペースへの物理ポインタの一種)が行ポインタとして使用されます。

クラスター化インデックスは、レコードがB-Treeの一部であることを意味します。レコードを挿入するときは、B-Treeを再リンクする必要があります。

クラスター化されたテーブルの行を更新すると、Bツリーが再リンクされます。 e。他のレコードの内部ポインタを更新します。

クラスタ化テーブルにセカンダリインデックスを作成する場合、クラスタ化インデックスキーの値が行ポインタとして使用されます。

これは、クラスター化インデックスが一意である必要があることを意味します。クラスター化インデックスが一意でない場合は、uniquifierと呼ばれる特別な非表示列がインデックスキーに追加され、一意の場合(およびサイズが大きくなる場合)になります。

また、列にセカンダリインデックスを作成すると、値またはクラスター化インデックスのキーがセカンダリインデックスのキーの一部になることにも注意してください。

クラスター化テーブルにインデックスを作成することにより、実際には常に複合インデックスを取得します

CREATE UNIQUE CLUSTERED INDEX CX_mytable_1234 (col1, col2, col3, col4)

CREATE INDEX IX_mytable_5678 (col5, col6, col7, col8)

インデックスIX_mytable_5678は、実際には次の列のインデックスです。

col5
col6
col7
col8
col1
col2
col3
col4

これにはもう1つの副作用があります。

クラスター化テーブルの単一列インデックスのDESC条件は、SQL Serverで意味があります。

このインデックス:

CREATE INDEX IX_mytable ON mytable (col1)

次のようなクエリで使用できます。

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id

、これは:

CREATE INDEX IX_mytable ON mytable (col1 DESC)

次のようなクエリで使用できます。

SELECT  TOP 100 *
FROM    mytable
ORDER BY
       col1, id DESC
38
Quassnoi

ヒープは、クラスタリングキーのない単なるテーブルであり、特定の物理的な順序を強制するキーはありません。

テーブルを一時的に使用して外部ファイルを一括ロードしてから、それらの行を他のテーブルに分散する場合を除いて、いつでもヒープを使用することはお勧めしません。

それ以外の場合は、クラスタリングキーを使用することを強くお勧めします。 SQL Serverは、デフォルトで主キーをクラスタリングキーとして使用します。これは、ほとんどの場合、適切な選択です。 GUID(UNIQUEIDENTIFIER)を主キーとして使用しない限り、それをクラスタリングキーとして使用するのは恐ろしい考えです。

Kimberly Trippの優れたブログ投稿 プライマリおよび/またはクラスタリングキーとしてのGUID および クラスター化インデックスの議論が続く を参照して、常にクラスタリングキーが必要な理由と、 GUIDは恐ろしいクラスタリングキーです。

私の推奨事項は次のとおりです。

  • すべてのケースの99%で、主キーとしてINT IDENTITYを使用し、SQLServerにクラスタリングキーも作成させようとします。
  • 例外#1:大量のデータを一括読み込みする場合は、一時テーブルのプライマリ/クラスタリングキーがなくても問題ない可能性があります
  • 例外#2:主キーとしてGUIDを使用する必要がある場合は、クラスタリングキーを別の列(できればINT IDENTITY)に設定します。別のINTを作成することもできます。他の列を使用できない場合は、その目的のためだけの列

マーク

10
marc_s

Books Online が最高の情報源です!

全体データベースエンジン-計画とアーキテクチャ-テーブルとインデックスデータ構造アーキテクチャは非常に優れた内部導入です。

このリンクから Books Onlineのローカルコピーをダウンロードできます(無料です)。これは、すべてのSql 2008の質問への最良の(そして公式の)リファレンスです。

0