バイトディクショナリエンコード
バイトディクショナリエンコードでは、ディスク上の列値のブロックごとに、一意の値の個別のディクショナリが作成されます (Amazon Redshift のディスクブロックは 1 MB を占有します。) ディクショナリには、元のデータ値のインデックスとして格納されている最大 256 個の 1 バイト値が含まれます。単一のブロックに 256 個を超える値が格納されている場合は、余分な値が非圧縮の raw 形式でブロックに書き込まれます。ディスクブロックごとに、このプロセスが繰り返されます。
このエンコードは、低カーディナリティ文字列の列に対して非常に効果的です。このエンコードは、列のデータドメインが一意の値 256 個未満である場合に最適です。
BYTEDICT でエンコードされた文字列データ型 (CHAR と VARCHAR) の列の場合、Amazon Redshift は圧縮されたデータを直接処理するベクタースキャンと述語評価を実行します。これらのスキャンでは、ハードウェア固有の単一命令複数データ (SIMD) 命令が使用されて、並列処理が行われます。これにより、文字列列のスキャンが大幅に加速されます。バイトディクショナリエンコードは、CHAR/VARCHAR 列に長い文字列が含まれる場合に特にスペース効率が高まります。
テーブルに、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 |
Japan | 5 | 30 |
Total | 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 |
Japan | 30 | 5 | 1 |
Sri Lanka | 30 | 3 | 1 |
Argentina | 30 | 4 | 1 |
Total | 300 | 10 |
この例の合計圧縮サイズは、次のように計算されます。ディクショナリに 6 つの異なるエントリが格納され (6 * 30 = 180)、テーブルに 10 個の 1 バイト圧縮値が含まれて、合計 190 バイトとなります。