ランレングスのエンコード
ランレングスエンコードは、連続して繰り返される値を、値と連続発生数 (実行の長さ) から成るトークンに置き換えます。ディスク上の列値のブロックごとに、一意の値の個別のディクショナリが作成されます (Amazon Redshift のディスクブロックは 1 MB を占有します。) このエンコードは、データ値が連続して頻繁に繰り返されるテーブル (例えば、テーブルがこれらの値でソートされる場合) に最も適しています。
例えば、大きなディメンションテーブルの列に、予測どおりに小さなドメイン (10 個未満の可能な値を持つ COLOR 列など) があるとします。これらの値は、データがソートされていない場合でも、テーブル全体で長いシーケンスに分類される可能性があります。
ソートキーとして指定された列に、ランレングスエンコードを適用することは推奨されません。範囲が制限されたスキャンは、ブロックに同様の数の行が含まれる場合にパフォーマンスが向上します。ソートキー列が、同じクエリ内の他の列よりもかなり高度に圧縮される場合、範囲が制限されたスキャンはパフォーマンスが低下する可能性があります。
次の表は、COLOR 列の例を使用して、ランレングスエンコードがどのように機能するかを示しています。
元のデータ値 | 元のサイズ (バイト) | 圧縮値 (トークン) | 圧縮サイズ (バイト) |
---|---|---|---|
Blue | 4 | {2,Blue} | 5 |
Blue | 4 | 0 | |
Green | 5 | {3,Green} | 6 |
Green | 5 | 0 | |
Green | 5 | 0 | |
Blue | 4 | {1,Blue} | 5 |
Yellow | 6 | {4,Yellow} | 7 |
Yellow | 6 | 0 | |
Yellow | 6 | 0 | |
Yellow | 6 | 0 | |
合計 | 51 | 23 |