メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

圧縮エンコードのテスト

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

注記

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

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

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

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

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

    Copy
    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. 次に、比較する各エンコードを含むテーブルを作成します。

    Copy
    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 句とともに使用して、すべての列に同じデータを挿入します。

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

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

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

    Copy
    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 から最良の圧縮結果が得られることが多くなります。

    Copy
    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 パーセントを超える圧縮になります。

Copy
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