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

ステップ 5: 圧縮エンコードを確認する

圧縮は、データの格納時にそのサイズを小さくする列レベルの操作です。圧縮によってストレージスペースが節約され、ストレージから読み込まれるデータのサイズが小さくなり、ディスク I/O の量が減少するので、クエリパフォーマンスが向上します。

デフォルトでは、Amazon Redshift は非圧縮の raw 形式でデータを格納します。Amazon Redshift データベースでテーブルを作成するとき、列に対して圧縮タイプ (エンコード) を定義できます。詳細については、「圧縮エンコード」を参照してください。

テーブルの作成時に圧縮エンコードをテーブルの列に手動で適用するか、または COPY コマンドを使用して自動的にロードデータが分析されて圧縮エンコードが適用されるようにできます。

圧縮エンコードを確認するには

  1. 各列によって使用される領域の量を探します。

    STV_BLOCKLIST システムビューに対してクエリを実行することで、各列に使用される 1 MB ディスクブロックの数を見つけます。MAX 集計関数が、各列のブロックの最高数を返します。この例では、WHERE 句で col < 17 を使用して、システム生成列を除外します。

    次のコマンドを実行します。

    Copy to clipboard
    select col, max(blocknum) from stv_blocklist b, stv_tbl_perm p where (b.tbl=p.id) and name ='lineorder' and col < 17 group by name, col order by col;

    結果は以下のようになります。

    Copy to clipboard
    col | max ----+----- 0 | 572 1 | 572 2 | 572 3 | 572 4 | 572 5 | 572 6 | 1659 7 | 715 8 | 572 9 | 572 10 | 572 11 | 572 12 | 572 13 | 572 14 | 572 15 | 572 16 | 1185 (17 rows)
  2. 別のエンコード方法を試してみます。

    このステップでは、同じ列でテーブルを作成します。ただし、列ごとに異なる圧縮エンコードを使用します。PART テーブルの p_name 列のデータを使用して多数の行を挿入することで、すべての列のデータが同じになるようにします。最後に、テーブルを調べてさまざまなエンコードによる列のサイズへの影響を比較します。

    1. 比較するエンコードを使用するテーブルを作成します。

      Copy to clipboard
      create table encodingshipmode ( moderaw varchar(22) encode raw, modebytedict varchar(22) encode bytedict, modelzo varchar(22) encode lzo, moderunlength varchar(22) encode runlength, modetext255 varchar(22) encode text255, modetext32k varchar(22) encode text32k);
    2. INSERT ステートメントを SELECT 句とともに使用して、すべての列に同じデータを挿入します。コマンドの実行には数分かかります。

      Copy to clipboard
      insert into encodingshipmode select lo_shipmode as moderaw, lo_shipmode as modebytedict, lo_shipmode as modelzo, lo_shipmode as moderunlength, lo_shipmode as modetext255, lo_shipmode as modetext32k from lineorder where lo_orderkey < 200000000;
    3. STV_BLOCKLIST システムテーブルに対してクエリを実行して、各列に使用される 1 MB ディスクブロックの数を比較します。

      Copy to clipboard
      select col, max(blocknum) from stv_blocklist b, stv_tbl_perm p where (b.tbl=p.id) and name = 'encodingshipmode' and col < 6 group by name, col order by col;

      クエリによって以下のような結果が返されます。クラスターの設定方法によって結果は異なりますが、相対的なサイズは同様のものになります。

      Copy to clipboard
      col | max –------+----- 0 | 221 1 | 26 2 | 61 3 | 192 4 | 54 5 | 105 (6 rows)

      列に示されているのは、以下のエンコードの結果です。

      • Raw

      • Bytedict

      • LZO

      • Runlength

      • Text255

      • TEXT32K

      このデータセットについては、2 つ目の列の BYTEDICT エンコードから、圧縮率が 8:1 を超える最良の結果が得られました。当然ながら、異なるデータセットからは異なる結果が得られます。

  3. ANALYZE COMPRESSION コマンドを使用して、既存のテーブルに推奨されるエンコードを表示します。

    次のコマンドを実行します。

    Copy to clipboard
    analyze compression lineorder;

    結果は以下のようになります。

    Copy to clipboard
    Table | Column | Encoding -----------+------------------+------------------- lineorder lo_orderkey delta lineorder lo_linenumber delta lineorder lo_custkey raw lineorder lo_partkey raw lineorder lo_suppkey raw lineorder lo_orderdate delta32k lineorder lo_orderpriority bytedict lineorder lo_shippriority runlength lineorder lo_quantity delta lineorder lo_extendedprice lzo lineorder lo_ordertotalprice lzo lineorder lo_discount delta lineorder lo_revenue lzo lineorder lo_supplycost delta32k lineorder lo_tax delta lineorder lo_commitdate delta32k lineorder lo_shipmode bytedict

    ANALYZE COMPRESSION により lo_shipmode 列には BYTEDICT エンコードが選択されています。

    手動で適用する圧縮エンコードを選択する例については、「例: CUSTOMER テーブルの圧縮エンコードの選択」を参照してください。

  4. SSB テーブルに自動圧縮を適用します。

    RAW エンコード以外の圧縮エンコードを指定していない空のテーブルにデータをロードすると、デフォルトでは、COPY コマンドによって圧縮エンコードが自動的に選択されて適用されます。このチュートリアルでは、次のステップ「テストデータセットを再作成する」の中で、COPY コマンドによってテーブルに最適なエンコードが自動的に選択されて適用されるようにしています。

    詳細については、「自動圧縮ありでテーブルをロードする」を参照してください。

次のステップ

ステップ 6: テストデータセットを再作成する