メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012年12月1日)

バイトディクショナリエンコード

バイトディクショナリエンコードでは、ディスク上の列値のブロックごとに、一意の値の個別のディクショナリが作成されます (Amazon Redshift ディスクブロックは 1 MB を占有します)。ディクショナリには、元のデータ値のインデックスとして格納されている最大 256 個の 1 バイト値が含まれます。単一のブロックに 256 個を超える値が格納されている場合は、余分な値が非圧縮の raw 形式でブロックに書き込まれます。ディスクブロックごとに、このプロセスが繰り返されます。

このエンコードは、列に含まれる一意の値の数が制限されている場合に非常に効果的です。このエンコードは、列のデータドメインが一意の値 256 個未満である場合に最適です。バイトディクショナリエンコードは、CHAR 列に長い文字列が含まれる場合に特に空間効率が高まります。

注記

バイトディクショナリエンコードは、VARCHAR 列と共に使用する場合は効果的であるとは限りません。サイズの大きな VARCHAR 列と共に BYTEDICT を使用すると、ディスクの使用率が上限を超える場合があります。VARCHAR 列に対しては、LZO などの BYTEDICT 以外のエンコードを使用することをお勧めします。

テーブルに、CHAR(30) データ型の COUNTRY 列があるとします。データがロードされると、Amazon Redshift はディクショナリを作成し、COUNTRY 列にインデックス値を入力します。ディクショナリには、インデックス作成された一意の値が含まれ、テーブル自体には、対応する値の 1 バイトのサブスクリプトのみが含まれます。

注記

固定長文字の列には末尾の空白が格納されます。したがって CHAR(30) 列では、バイトディクショナリエンコードを使用すると、圧縮値ごとに 29 バイトのストレージが節約されます。

次の表は、COUNTRY 列のディクショナリを示しています。

一意のデータ値 ディクショナリインデックス サイズ (固定長、30 バイト/値)
England 0 30
United States of America 1 30
Venezuela 2 30
Sri Lanka 3 30
Argentina 4 30
日本 5 30
合計 180

次の表は、COUNTRY 列の値を示しています。

元のデータ値 元のサイズ (固定長、30 バイト/値) 圧縮値 (インデックス) 新しいサイズ (バイト)
England 30 0 1
England 30 0 1
United States of America 30 1 1
United States of America 30 1 1
Venezuela 30 2 1
Sri Lanka 30 3 1
Argentina 30 4 1
日本 30 5 1
Sri Lanka 30 3 1
Argentina 30 4 1
合計 300 10

この例の合計圧縮サイズは、次のように計算されます。ディクショナリに 6 つの異なるエントリが格納され (6 * 30 = 180)、テーブルに 10 個の 1 バイト圧縮値が含まれて、合計 190 バイトとなります。