28

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

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

前もって感謝します、ジョージ

4

3 に答える 3

39

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

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

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

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

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

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

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

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

これは、クラスター化インデックスが一意である必要があることを意味します。クラスター化されたインデックスが一意でない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
于 2009-08-27T14:19:19.750 に答える
11

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

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

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

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

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

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

マルク

于 2009-08-27T14:34:26.370 に答える
0

Books Onlineは最高の情報源です。

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

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

于 2009-08-27T14:17:58.720 に答える