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