SQL Server 2008 を使用しています。テーブルにクラスター化インデックスがない場合はヒープと呼ばれ、それ以外の場合はストレージ モデルがクラスター化インデックス (B ツリー) と呼ばれます。
ヒープ ストレージの正確な意味、外観、「ヒープ」データ構造 (最小ヒープ、最大ヒープなど) として編成されているかどうかについて詳しく知りたいです。おすすめの読み物は?もう少し内部構造を知りたいのですが、深すぎません。:-)
前もって感謝します、ジョージ
SQL Server 2008 を使用しています。テーブルにクラスター化インデックスがない場合はヒープと呼ばれ、それ以外の場合はストレージ モデルがクラスター化インデックス (B ツリー) と呼ばれます。
ヒープ ストレージの正確な意味、外観、「ヒープ」データ構造 (最小ヒープ、最大ヒープなど) として編成されているかどうかについて詳しく知りたいです。おすすめの読み物は?もう少し内部構造を知りたいのですが、深すぎません。:-)
前もって感謝します、ジョージ
ヒープ ストレージは、これらのヒープとは関係ありません。
ヒープは、レコード自体が順序付けられていない (つまり、互いにリンクされていない) ことを意味します。
レコードを挿入すると、データベースが見つけた空き領域に挿入されます。
HEAP
テーブルにセカンダリ インデックスを作成すると、 RID
(ストレージ スペースへの一種の物理ポインター) が行ポインターとして使用されます。
クラスタ化インデックスは、レコードが の一部であることを意味しB-Tree
ます。レコードを挿入するときは、再リンクするB-Tree
必要があります。
クラスター化されたテーブルにセカンダリ インデックスを作成すると、クラスター化されたインデックス キーの値が行ポインターとして使用されます。
これは、クラスター化インデックスが一意である必要があることを意味します。クラスター化されたインデックスが一意でない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
ヒープは、クラスタリング キーのない単なるテーブルです。特定の物理的な順序を強制するキーはありません。
一時的にテーブルを使用して外部ファイルを一括読み込みし、それらの行を他のテーブルに分散する場合を除いて、いつでもヒープを使用することはお勧めしません。
それ以外の場合は、クラスタリング キーを使用することを強くお勧めします。SQL Server は、デフォルトでプライマリ キーをクラスタリング キーとして使用します。ほとんどの場合、これが適切な選択です。GUID (UNIQUEIDENTIFIER) を主キーとして使用しない限り、それをクラスタリング キーとして使用するのは恐ろしい考えです。
Kimberly Tripp の優れたブログ投稿GUID をプライマリおよび/またはクラスタリング キーとして投稿し、クラスター化されたインデックスの議論が続くを参照して、常にクラスタリング キーが必要な理由と、GUID が恐ろしいクラスタリング キーである理由についての優れた説明を参照してください。
私の推奨事項は次のとおりです。
INT IDENTITY
をプライマリ キーとして使用し、SQL Server にそれをクラスタリング キーとしても使用させようとします。INT IDENTITY
他の列を使用できない場合は、その目的のためだけに別の INT 列を作成することもできます。マルク
Books Onlineは最高の情報源です。
データベース エンジン - 計画とアーキテクチャ - テーブルとインデックス データ構造のアーキテクチャ全体は、非常に優れた内部紹介です。
このリンクから、Books Online のローカル コピーをダウンロードできます (無料です)。これは、Sql 2008 のすべての質問に対する最良の (そして公式の) リファレンスです。