次の方法で共有


ヒープ (クラスター化インデックスのないテーブル)

ヒープは、クラスター化インデックスのないテーブルです。 ヒープとして格納されているテーブルには、1 つ以上の非クラスター化インデックスを作成できます。 データは、順序を指定せずにヒープに格納されます。 通常、データは最初は行がテーブルに挿入される順序で格納されますが、データベース エンジンは、行を効率的に格納するためにヒープ内でデータを移動できます。そのため、データの順序を予測できません。 ヒープから返される行の順序を保証するには、 ORDER BY 句を使用する必要があります。 行の格納順序を指定するには、テーブルがヒープでないように、テーブルにクラスター化インデックスを作成します。

クラスター化インデックスを作成する代わりに、テーブルをヒープとして残しておくために適切な理由がある場合がありますが、ヒープを効果的に使用することは高度なスキルです。 テーブルをヒープとして残す正当な理由がない限り、ほとんどのテーブルには慎重に選択されたクラスター化インデックスが必要です。

ヒープを使用するタイミング

テーブルがヒープであり、非クラスター化インデックスがない場合は、テーブル全体を調べて (テーブル スキャン)、任意の行を検索する必要があります。 これは、会社の 12 の地域オフィスの一覧など、テーブルが小さい場合に許容できます。

テーブルがヒープとして格納されている場合、個々の行は、ページ上のファイル番号、データ ページ番号、スロットで構成される行識別子 (RID) への参照によって識別されます。 行 ID は、小さく効率的な構造です。 データアーキテクトは、非クラスター化インデックスを介して常にデータにアクセスし、RID がクラスター化インデックス キーよりも小さい場合にヒープを使用することがあります。

ヒープを使用しない場合

データが頻繁にソートされた順序で返される場合は、ヒープを使用しないでください。 並べ替え列のクラスター化インデックスは、並べ替え操作を回避できます。

データが頻繁にグループ化される場合は、ヒープを使用しないでください。 データはグループ化する前に並べ替える必要があり、並べ替え列のクラスター化インデックスによって並べ替え操作が回避される可能性があります。

データ範囲がテーブルから頻繁に照会される場合は、ヒープを使用しないでください。 範囲列のクラスター化インデックスは、ヒープ全体の並べ替えを回避します。

非クラスター化インデックスがなく、テーブルが大きい場合は、ヒープを使用しないでください。 ヒープでは、任意の行を検索するには、ヒープのすべての行を読み取る必要があります。

ヒープの管理

ヒープを作成するには、クラスター化インデックスのないテーブルを作成します。 テーブルに既にクラスター化インデックスがある場合は、クラスター化インデックスを削除して、テーブルをヒープに返します。

ヒープを削除するには、ヒープにクラスター化インデックスを作成します。

無駄な領域を再利用するためにヒープを再構築するには、ヒープにクラスター化インデックスを作成し、そのクラスター化インデックスを削除します。

警告

クラスター化インデックスを作成または削除するには、テーブル全体を書き直す必要があります。 テーブルに非クラスター化インデックスがある場合は、クラスター化インデックスが変更されるたびに、すべての非クラスター化インデックスを再作成する必要があります。 そのため、ヒープからクラスター化インデックス構造または戻り値に変更するには時間がかかり、tempdb 内のデータを並べ替えるためにディスク領域が必要になります。

インデックス作成 (Transact-SQL)

DROP INDEX (Transact-SQL)

クラスター化インデックスと非クラスター化インデックスの概念