ヒープ (クラスター化インデックスなしのテーブル)
ヒープとはクラスター化インデックスを使用しないテーブルのことです。 1 つまたは複数の非クラスター化インデックスを、ヒープとして格納されているテーブルに作成することができます。 ヒープには、順序を指定せずにデータが格納されます。 通常、最初にデータが格納される順序はテーブルに行が挿入された順序と同じですが、データベース エンジンでは行を効率的に格納できるようにヒープ内でデータが移動される場合があるため、データの順序は予測できません。 ヒープから返される行の順序を保証するには、ORDER BY 句を使用する必要があります。 テーブルにクラスター化インデックスを作成し、テーブルがヒープにならないようにすることで、行が格納される順序を指定することができます。
注 |
---|
クラスター化インデックスを作成する代わりにテーブルをヒープのままにしておくとよい場合もありますが、ヒープを効果的に使用するには高度なスキルが必要です。 テーブルをヒープのままにしておく妥当な理由がない限り、ほとんどのテーブルには、慎重に選択されたクラスター化インデックスが必要です。 |
ヒープを使用する場合
非クラスター化インデックスのないヒープ テーブルの場合、行を検索するには (テーブル スキャンで) テーブル全体を調べる必要があります。 企業の 12 の支社の一覧など、テーブルが小さい場合にはこの方法で対応できます。
テーブルがヒープとして格納されている場合、各行の識別には、ファイル番号、データ ページ番号、およびページのスロットで構成された行識別子 (RID) が使用されます。 行識別子には、小さく効率的な構造が使用されています。 データ設計者は、データが常に非クラスター化インデックスを通じてアクセスされ、RID がクラスター化インデックス キーより小さい場合に、ヒープを使用することもあります。
ヒープを使用しない場合
データが、並べ替えた順序で頻繁に取得される場合は、ヒープを使用しないでください。 並べ替え用の列にクラスター化インデックスが存在すると、並べ替え操作が実行されない場合があります。
データが頻繁にグループ化される場合は、ヒープを使用しないでください。 データの並べ替えはグループ化よりも前に行う必要がありますが、並べ替え用の列にクラスター化インデックスが存在すると、並べ替え操作が実行されない場合があります。
広範囲のデータがテーブルから頻繁に照会される場合は、ヒープを使用しないでください。 範囲列にクラスター化インデックスが存在すると、ヒープ全体の並べ替えが実行されなくなります。
非クラスター化インデックスが存在せず、テーブルが大きい場合は、ヒープを使用しないでください。 ヒープでは、特定の行を探すためにヒープのすべての行を読み取る必要があります。
ヒープの管理
ヒープを作成するには、クラスター化インデックスのないテーブルを作成します。 既にテーブルにクラスター化インデックスが含まれている場合は、クラスター化インデックスを削除して、テーブルをヒープに戻します。
ヒープを削除するには、ヒープにクラスター化インデックスを作成します。
使用されていない領域を再利用できるようにヒープを再構築するには、ヒープにクラスター化インデックスを作成してから、そのクラスター化インデックスを削除します。
注意 |
---|
クラスター化インデックスを作成または削除するには、テーブル全体を再作成する必要があります。 テーブルに非クラスター化インデックスがある場合は、クラスター化インデックスが変更されるたびに、すべての非クラスター化インデックスを再作成する必要があります。 このため、ヒープからクラスター化インデックス構造への変更、またはその逆の変更には時間がかかり、tempdb でデータの順序を並べ替えるためのディスク領域が必要になります。 |