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
を使用し、SQLServerにクラスタリングキーも作成させようとします。INT IDENTITY
)に設定します。別のINTを作成することもできます。他の列を使用できない場合は、その目的のためだけの列マーク
Books Online が最高の情報源です!
全体データベースエンジン-計画とアーキテクチャ-テーブルとインデックスデータ構造アーキテクチャは非常に優れた内部導入です。
このリンクから Books Onlineのローカルコピーをダウンロードできます(無料です)。これは、すべてのSql 2008の質問への最良の(そして公式の)リファレンスです。