ページの圧縮の実装Page Compression Implementation

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

このトピックでは、 データベース エンジンDatabase Engine に実装されているページの圧縮方法の概要を説明します。This topic summarizes how the データベース エンジンDatabase Engine implements page compression. この概要では、データに必要なストレージ領域の計画に役立つ基本的な情報を提供します。This summary provides basic information to help you plan the storage space that you need for your data.

ページの圧縮は、テーブル、テーブル パーティション、インデックス、およびインデックス パーティションに対して同じような方法で行われます。Page compression is similar for tables, table partitions, indexes, and index partitions. テーブルについてのページの圧縮に関する次の説明は、すべての種類のオブジェクトについてのページの圧縮に当てはまります。The following description of page compression for a table applies equally to page compression for all object types. 次の例では文字列を圧縮しますが、プレフィックスの圧縮とディクショナリの圧縮の両方において、他のデータ型に同じ原則が当てはまります。The following examples compress character strings, but both prefix and dictionary compression apply the same principles to other data types.

ページの圧縮によるリーフ レベルのテーブルとインデックスの圧縮では、次の順番で 3 つの操作を実行します。Compressing the leaf level of tables and indexes with page compression consists of three operations in the following order:

  1. 行の圧縮Row compression

  2. プレフィックスの圧縮Prefix compression

  3. ディクショナリの圧縮Dictionary compression

ページの圧縮を使用する場合、行の圧縮のみを使用して、リーフ レベル以外のページのインデックスが圧縮されます。When you use page compression, non-leaf-level pages of indexes are compressed by using only row compression. 行の圧縮の詳細については、 「行の圧縮の実装」を参照してください。For more information about row compression, see Row Compression Implementation.

プレフィックスの圧縮Prefix Compression

圧縮される各ページに対して、プレフィックスの圧縮では次の手順が実行されます。For each page that is being compressed, prefix compression uses the following steps:

  1. 列ごとに、各列の値についてストレージ領域の削減に使用できる値が識別されます。For each column, a value is identified that can be used to reduce the storage space for the values in each column.

  2. 各列のプレフィックス値を表す行が作成され、ページ ヘッダーの直後にある圧縮情報 (CI) 構造体に格納されます。A row that represents the prefix values for each column is created and stored in the compression information (CI) structure that immediately follows the page header.

  3. 列内の連続するプレフィックス値が、対応するプレフィックスへの参照に置き換えられます。The repeated prefix values in the column are replaced by a reference to the corresponding prefix. 行の値が選択されたプレフィックス値と完全に一致しなくても、部分的な一致を示すことができます。If the value in a row does not exactly match the selected prefix value, a partial match can still be indicated.

次の図に、プレフィックスの圧縮が行われる前のテーブルのサンプル ページを示します。The following illustration shows a sample page of a table before prefix compression.

プレフィックスの圧縮前のページPage before prefix compression

次の図に、プレフィックスの圧縮後の同じページを示します。The following illustration shows the same page after prefix compression. プレフィックスはヘッダーに移動され、列の値はプレフィックスへの参照に変更されます。The prefix is moved to the header, and the column values are changed to references to the prefix.

プレフィックスの圧縮後のページPage after prefix compression

1 行目の最初の列にある値 4b は、その行にプレフィックスの最初の 4 文字 (aaab) に加え、文字 b が存在することを示します。In the first column of the first row, the value 4b indicates that the first four characters of the prefix (aaab) are present for that row, and also the character b. これにより、結果の値は aaabb (元の値) になります。This makes the resultant value aaabb, which is the original value.

ディクショナリの圧縮Dictionary Compression

プレフィックスの圧縮が完了した後、ディクショナリの圧縮が適用されます。After prefix compression has been completed, dictionary compression is applied. ディクショナリの圧縮では、ページ上の任意の場所で繰り返される値を検索し、それらの値を CI 領域に格納します。Dictionary compression searches for repeated values anywhere on the page, and stores them in the CI area. プレフィックスの圧縮とは異なり、ディクショナリの圧縮は 1 つの列に制限されません。Unlike prefix compression, dictionary compression is not restricted to one column. ディクショナリの圧縮では、ページ上の任意の場所で繰り返し現れる値を置き換えることができます。Dictionary compression can replace repeated values that occur anywhere on a page. 次の図に、ディクショナリの圧縮後の同じページを示します。The following illustration shows the same page after dictionary compression.

ディクショナリの圧縮後のページPage after dictionary compression

値 4b がページのさまざまな列から参照されていることに注意してください。Note that the value 4b has been referenced from different columns of the page.

ページの圧縮が行われるタイミングWhen Page Compression Occurs

ページの圧縮を含む新しいテーブルを作成した場合、圧縮は行われません。When a new table is created that has page compression, no compression occurs. ただし、テーブルのメタデータで、ページの圧縮を使用する必要があることが示されます。However, the metadata for the table indicates that page compression should be used. データが最初のデータ ページに追加されると、データに対して行の圧縮が行われます。As data is added to the first data page, data is row-compressed. このページはいっぱいではないため、ページの圧縮による利点は得られません。Because the page is not full, no benefit is gained from page compression. ページがいっぱいになると、次の行を追加することによって、ページの圧縮操作が開始されます。When the page is full, the next row to be added initiates the page compression operation. ページ全体が確認され、各列でプレフィックスの圧縮が評価された後、すべての列でディクショナリの圧縮が評価されます。The whole page is reviewed; each column is evaluated for prefix compression, and then all columns are evaluated for dictionary compression. ページの圧縮により、ページ上に行を追加するための十分な領域が作成されると、行が追加され、行とページの両方でデータが圧縮されます。If page compression has created enough room on the page for an additional row, the row is added, and the data is both row- and page-compressed. ページの圧縮によって確保される領域から、CI 構造体に必要な領域を引いた領域が小さい場合は、そのページに対してページの圧縮は使用されません。If the space gained by page compression minus the space that is required for the CI structure is not significant, page compression is not used for that page. それ以降に追加される行はこの新しいページ内に格納されます。行が収まらない場合は、別の新しいページがテーブルに追加されます。Future rows either fit onto the new page or, if they do not fit, a new page is added to the table. 最初のページと同様に、新しいページでは最初にページの圧縮は行われません。Similar to the first page, the new page is not at first page-compressed.

データが含まれる既存のテーブルがページの圧縮対象に変わると、各ページは再構築され、評価されます。When an existing table that contains data is converted to page compression, each page is rebuilt and evaluated. すべてのページが再構築されると、テーブル、インデックス、またはパーティションも再構築されます。Rebuilding all the pages causes the rebuilding of the table, index, or partition.

参照See Also

データの圧縮 Data Compression
「行の圧縮の実装」Row Compression Implementation