Redshiftは列レベルで圧縮形式を選ぶことができ、これにより以下の効果が得られる。
- ストレージスペースが節約
- データのサイズが軽量化 => ディスク I/O の量が減少 => クエリパフォーマンスが向上
このエンコーディングの形式がいろいろあるので、公式の内容を元に軽くメモ。
エンコーディングの指定方法
エンコーディングの指定は、CREATE TABLE
とALTER TABLE
時のみ。
既存のカラムのエンコーディングの変更はむりっぽい。
# 新規作成時
CREATE TABLE products (
id INT encode delta,
name CHAR(20) encode bytedict
);
# カラム追加時
ALTER TABLE products ADD created_at date encode delta32k;
各エンコーディングの特色
エンコーディングタイプ | キーワード | 説明 |
---|---|---|
RAW | raw | 非圧縮 |
BYTEDICT | bytedict | 列のデータドメインが一意の値 256 個未満である場合に最適 |
DELTA | delta, delta32k | 列内の連続する値間の差を記録することによりデータを圧縮。 日時列にとって非常に有用 |
LZO | lzo | 非常に高い圧縮率と良好なパフォーマンスを実現 文字列などの自由形式テキストに最適 |
MOSTLY | mostly8, mostly16, mostly32 | 列のデータ型よりも小さなサイズで格納。 値が-128-127であれば INT(4byte) -> MOSTLY8(2byte)
|
RUNLENGTH | runlength | 連続して繰り返される値を、値と連続発生数から成るトークンに置き換え、ディクショナリ化 データ値が連続して頻繁に繰り返されるテーブルに最適 ソートキーは非推奨 |
TEXT | text255, text32k | ブロックごとに、一意の単語の個別のディクショナリ 同じ単語が頻繁に出現する VARCHAR 列を圧縮する場合に有用 |
型別チェックリスト
INTEGER (SMALLINT, INT, BIGINT)
- 同じ値が頻繁に繰り返されている => RUNLENGTH
- 値が制限されている(256種類以内) => BYTEDICT
- 値が連続している => DELTA
- 値の大半が小さな値 => MOSTLY
- その他 => RAW
REAL, DOUBLE PRECISION
- 同じ値が頻繁に繰り返されている => RUNLENGTH
- 値が制限されている(256種類以内) => BYTEDICT
- その他 => RAW
DECIMAL
- 同じ値が頻繁に繰り返されている => RUNLENGTH
- 値が制限されている(256種類以内) => BYTEDICT
- 値が連続している => DELTA
- 値の大半が小さな値 => MOSTLY
- その他 => RAW
DATE, TIMESTAMP
- 同じ値が頻繁に繰り返されている => RUNLENGTH
- 値が制限されている(256種類以内) => BYTEDICT
- 値が連続している => DELTA
- その他 => LZO
VARCHAR
- 同じ値が頻繁に繰り返されている => RUNLENGTH
- 値が制限されている(256種類以内) => BYTEDICT
- 値が連続している => DELTA
- 値の大半が小さな値 => MOSTLY
- 同じ単語が頻繁に出現する => TEXT
- その他 => LZO