圧縮エンコードのテスト - Amazon Redshift

圧縮エンコードのテスト

列のエンコードを手動で指定する場合は、データに対してさまざまなエンコードをテストできます。

注記

できる限り COPY コマンドを使用してデータをロードし、データに基づいて最適なエンコードを COPY コマンドが選択できるようにすることをお勧めします。または、ANALYZE COMPRESSION コマンドを使用して、既存のデータに対して提案されるエンコードを表示できます。自動圧縮の適用の詳細については、「自動圧縮ありでテーブルをロードする」を参照してください。

データ圧縮の有意義なテストを実行するには、多数の行が必要になります。この例では、2 つのテーブル VENUE と LISTING から選択を行うステートメントを使用して、テーブルを作成し行を挿入します。通常は 2 つのテーブルを結合する WHERE 句は省略します。その結果、VENUE テーブルの行が LISTING テーブルのすべての行に結合されて、合計 3200 万以上の行になります。これはデカルト結合と呼ばれ、通常はお勧めしません。ただし、この目的においては、多数の行を作成する便利な方法です。テストするデータを含む既存のテーブルがある場合は、このステップをスキップできます。

サンプルデータを含むテーブルを作成したら、7 列のテーブルを作成します。それぞれ異なる圧縮エンコード (raw、bytedict、lzo、run length、text255、text32k、および zstd) が適用されます。最初のテーブルからデータを選択する INSERT コマンドを実行することにより、各列に全く同じデータを入力します。

圧縮エンコードをテストするには、以下を実行します。

  1. (オプション) 最初に、デカルト結合を使用して、多数の行を含むテーブルを作成します。既存のテーブルをテストする場合は、このステップをスキップします。

    create table cartesian_venue( venueid smallint not null distkey sortkey, venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer); insert into cartesian_venue select venueid, venuename, venuecity, venuestate, venueseats from venue, listing;
  2. 次に、比較する各エンコードを含むテーブルを作成します。

    create table encodingvenue ( venueraw varchar(100) encode raw, venuebytedict varchar(100) encode bytedict, venuelzo varchar(100) encode lzo, venuerunlength varchar(100) encode runlength, venuetext255 varchar(100) encode text255, venuetext32k varchar(100) encode text32k, venuezstd varchar(100) encode zstd);
  3. INSERT ステートメントを SELECT 句とともに使用して、すべての列に同じデータを挿入します。

    insert into encodingvenue select venuename as venueraw, venuename as venuebytedict, venuename as venuelzo, venuename as venuerunlength, venuename as venuetext32k, venuename as venuetext255, venuename as venuezstd from cartesian_venue;
  4. 新しいテーブルの行数を確認します。

    select count(*) from encodingvenue count ---------- 38884394 (1 row)
  5. STV_BLOCKLIST システムテーブルをクエリ処理して、各列で使用される 1 MB のディスクブロックの数と比較します。

    MAX 集計関数が、各列のブロックの最高数を返します。STV_BLOCKLIST テーブルには、3 つのシステム生成列の詳細が含まれます。この例では、WHERE 句で col < 6 を使用して、システム生成列を除外します。

    select col, max(blocknum) from stv_blocklist b, stv_tbl_perm p where (b.tbl=p.id) and name ='encodingvenue' and col < 7 group by name, col order by col;

    クエリは次の結果を返します。列には 0 から始まる番号が付けられています。クラスターの設定方法によっては結果の数が異なる場合がありますが、相対的なサイズは同様のものになります。このデータセットについては、2 列目の BYTEDICT エンコードから、最良の結果が得られました。このアプローチの圧縮比は 20:1 よりも優れています。LZO および ZSTD エンコードからも良好な結果が得られました。もちろん、異なるデータセットからは異なる結果が得られます。より長い文字列が列に含まれる場合は、LZO から最良の圧縮結果が得られることが多くなります。

    col | max -----+----- 0 | 203 1 | 10 2 | 22 3 | 204 4 | 56 5 | 72 6 | 20 (7 rows)

既存のテーブルにデータが存在する場合は、ANALYZE COMPRESSION コマンドを使用して、テーブルに対して提案されるエンコードを表示できます。例えば、次の例は、3800 万行を含む VENUE テーブル CARTESIAN_VENUE のコピーに対して推奨されるエンコードを示しています。ANALYZE COMPRESSION により VENUENAME 列には LZO エンコードが推奨されています。ANALYZE COMPRESSION は減少率を含む複数の要素に基づいて最適な圧縮を選択します。この特定のケースでは、BYTEDICT の方がより圧縮できますが、LZO でも 90 パーセントを超える圧縮になります。

analyze compression cartesian_venue; Table | Column | Encoding | Est_reduction_pct ---------------+------------+----------+------------------ reallybigvenue | venueid | lzo | 97.54 reallybigvenue | venuename | lzo | 91.71 reallybigvenue | venuecity | lzo | 96.01 reallybigvenue | venuestate | lzo | 97.68 reallybigvenue | venueseats | lzo | 98.21