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

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

注意

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

ヒープを使用する場合

非クラスター化インデックスのないヒープ テーブルの場合、行を検索するには (テーブル スキャンで) テーブル全体を調べる必要があります。 企業の 12 の支社の一覧など、テーブルが小さい場合にはこの方法で対応できます。

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

ヒープを使用しない場合

データが、並べ替えた順序で頻繁に取得される場合は、ヒープを使用しないでください。 並べ替え用の列にクラスター化インデックスが存在すると、並べ替え操作が実行されない場合があります。

データが頻繁にグループ化される場合は、ヒープを使用しないでください。 データの並べ替えはグループ化よりも前に行う必要がありますが、並べ替え用の列にクラスター化インデックスが存在すると、並べ替え操作が実行されない場合があります。

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

非クラスター化インデックスが存在せず、テーブルが大きい場合は、ヒープを使用しないでください。 ヒープでは、特定の行を探すためにヒープのすべての行を読み取る必要があります。

ヒープの管理

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

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

使用されていない領域を再利用できるようにヒープを再構築するには、ヒープにクラスター化インデックスを作成してから、そのクラスター化インデックスを削除します。

注記注意

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

関連コンテンツ

CREATE INDEX (Transact-SQL)

DROP INDEX (Transact-SQL)

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