ページの圧縮の実装
このトピックでは、データベース エンジンに実装されているページの圧縮方法の概要を説明します。 この概要では、データに必要なストレージ領域の計画に役立つ基本的な情報を提供します。
ページの圧縮は、テーブル、テーブル パーティション、インデックス、およびインデックス パーティションに対して同じような方法で行われます。 テーブルについてのページの圧縮に関する次の説明は、すべての種類のオブジェクトについてのページの圧縮に当てはまります。 次の例では文字列を圧縮しますが、プレフィックスの圧縮とディクショナリの圧縮の両方において、他のデータ型に同じ原則が当てはまります。
ページの圧縮によるリーフ レベルのテーブルとインデックスの圧縮では、次の順番で 3 つの操作を実行します。
行の圧縮
プレフィックスの圧縮
ディクショナリの圧縮
ページの圧縮を使用する場合、行の圧縮のみを使用して、リーフ レベル以外のページのインデックスが圧縮されます。 行の圧縮の詳細については、「行の圧縮の実装」を参照してください。
プレフィックスの圧縮
圧縮される各ページに対して、プレフィックスの圧縮では次の手順が実行されます。
列ごとに、各列の値についてストレージ領域の削減に使用できる値が識別されます。
各列のプレフィックス値を表す行が作成され、ページ ヘッダーの直後にある圧縮情報 (CI) 構造体に格納されます。
列内の連続するプレフィックス値が、対応するプレフィックスへの参照に置き換えられます。 行の値が選択されたプレフィックス値と完全に一致しなくても、部分的な一致を示すことができます。
次の図に、プレフィックスの圧縮が行われる前のテーブルのサンプル ページを示します。
次の図に、プレフィックスの圧縮後の同じページを示します。 プレフィックスはヘッダーに移動され、列の値はプレフィックスへの参照に変更されます。
1 行目の最初の列にある値 4b は、その行にプレフィックスの最初の 4 文字 (aaab) に加え、文字 b が存在することを示します。 これにより、結果の値は aaabb (元の値) になります。
ディクショナリの圧縮
プレフィックスの圧縮が完了した後、ディクショナリの圧縮が適用されます。 ディクショナリの圧縮では、ページ上の任意の場所で繰り返される値を検索し、それらの値を CI 領域に格納します。 プレフィックスの圧縮とは異なり、ディクショナリの圧縮は 1 つの列に制限されません。 ディクショナリの圧縮では、ページ上の任意の場所で繰り返し現れる値を置き換えることができます。 次の図に、ディクショナリの圧縮後の同じページを示します。
値 4b がページのさまざまな列から参照されていることに注意してください。
ページの圧縮が行われるタイミング
ページの圧縮を含む新しいテーブルを作成した場合、圧縮は行われません。 ただし、テーブルのメタデータで、ページの圧縮を使用する必要があることが示されます。 データが最初のデータ ページに追加されると、データに対して行の圧縮が行われます。 このページはいっぱいではないため、ページの圧縮による利点は得られません。 ページがいっぱいになると、次の行を追加することによって、ページの圧縮操作が開始されます。 ページ全体が確認され、各列でプレフィックスの圧縮が評価された後、すべての列でディクショナリの圧縮が評価されます。 ページの圧縮により、ページ上に行を追加するための十分な領域が作成されると、行が追加され、行とページの両方でデータが圧縮されます。 ページの圧縮によって確保される領域から、CI 構造体に必要な領域を引いた領域が小さい場合は、そのページに対してページの圧縮は使用されません。 それ以降に追加される行はこの新しいページ内に格納されます。行が収まらない場合は、別の新しいページがテーブルに追加されます。 最初のページと同様に、新しいページでは最初にページの圧縮は行われません。
データが含まれる既存のテーブルがページの圧縮対象に変わると、各ページは再構築され、評価されます。 すべてのページが再構築されると、テーブル、インデックス、またはパーティションも再構築されます。