デルタエンコード - Amazon Redshift

デルタエンコード

デルタエンコードは、日時列にとって非常に有用です。

デルタエンコードは、列内の連続する値間の差を記録することにより、データを圧縮します。この差は、ディスク上の列値の各ブロックに対する個別のディクショナリに記録されます (Amazon Redshift のディスクブロックは 1 MB を占有します。) 例えば、列に 1 から 10 までの 10 個の整数が順番に含まれているとします。最初の値は 4 バイトの整数 (+ 1 バイトのフラグ) として保存されます。次の 9 つはそれぞれ値 1 のバイトとして保存され、前の値より 1 大きいことを示します。

デルタエンコードには、次の 2 つのバージョンがあります。

  • 差を 1 バイト値 (8 ビット整数) として記録する DELTA

  • 差を 2 バイト値 (16 ビット整数) として記録する DELTA32K

1 バイトを使用して列内のほとんどの値を圧縮できる場合は、1 バイトの変形が非常に効果的です。しかし、最悪の場合、デルタがより大きいと、このエンコードは非圧縮データを保存する場合よりも多少効果が低くなる可能性もあります。16 ビットバージョンにも同様の論理が当てはまります。

2 つの値間の差が 1 バイトの範囲 (DELTA) または 2 バイトの範囲 (DELTA32K) を超える場合は、先頭に 1 バイトのフラグが付けられて元の完全な値が格納されます。1 バイトの範囲は -127~127、2 バイトの範囲は -32K~32K です。

次の表は、デルタエンコードが数値列に対してどのように機能するかを示しています。

元のデータ値 元のサイズ (バイト) 差 (デルタ) 圧縮値 圧縮サイズ (バイト)
1 4 1 1+4 (フラグ + 実際の値)
5 4 4 4 1
50 4 45 45 1
200 4 150 150 1+4 (フラグ + 実際の値)
185 4 -15 -15 1
220 4 35 35 1
221 4 1 1 1
合計 28 15