Help us understand the problem. What is going on with this article?

Redshift ストレージの空き容量を増やすなら、SVV_TABLE_INFOシステムビューを見るのが効果的

More than 1 year has passed since last update.

前回のRedshiftのストレージ容量のメンテナンスで取りあげたSVV_TABLE_INFOシステムビュー。
このビューにencodedというフィールドがあるのですが
所どころ「N」なってたりすることがあります。

Redshift
rsdb1=# select * from SVV_TABLE_INFO;

 database | schema | table_id |  table  | encoded | diststyle | sortkey1 | max_varchar | sortkey1_enc | sortkey_num | size | pct_used | empty | unsorted | stats_off | tbl_rows  | skew_sortkey1 | skew_rows 
----------+--------+----------+---------+---------+-----------+----------+-------------+--------------+-------------+------+----------+-------+----------+-----------+-----------+---------------+-----------
 rsdb1    | public |   100523 | table2  | Y       | EVEN      |          |        4096 |              |           0 |  190 |   0.0498 |     0 |          |     11.34 |    932239 |               |          
 rsdb1    | public |   100617 | table3  | Y       | EVEN      |          |        4096 |              |           0 |  591 |   0.1549 |     0 |          |      8.96 |   8566046 |               |          
 rsdb1    | public |   100747 | table4  | N       | EVEN      |          |        4096 |              |           0 | 8049 |   0.0466 |     0 |          |      0.00 |    130690 |               |          
 rsdb1    | public |   150278 | table5  | Y       | EVEN      |          |       65535 |              |           0 |  178 |   2.1103 |     0 |          |     17.82 | 132678814 |               |          
 rsdb1    | public |   159527 | table6  | Y       | EVEN      |          |         512 |              |           0 |  692 |   0.1814 |     0 |          |      4.10 |     62850 |               |          
 rsdb1    | public |   100565 | table7  | N       | EVEN      |          |        4096 |              |           0 | 7527 |   1.9734 |     0 |          |      5.15 |  12146431 |               |          

encodedが意味しているところは、
「該当のテーブルのすべてのフィールド/列が非圧縮です」
ということ。

Redshiftは列圧縮機能が搭載されており、列ごとに任意に列圧縮モードが指定できます。
実際にはどのような列圧縮かを調べるには
各列ごとの定義状況が確認できるpg_table_defシステムカタログを参照するとよいです。

Redshift
rsdb1=# SELECT * FROM pg_table_def WHERE tablename = 'table4';

 schemaname | tablename | column      |          type           | encoding | distkey | sortkey | notnull 
------------+-------------------------+---------------------------------+-------------------------+----------+---------+---------+---------
 public     | table4    | customerid  | character varying(20)   | none     | f       |       0 | f
 public     | table4    | label       | character varying(100)  | none     | f       |       0 | f
 public     | table4    | impressions | bigint                  | none     | f       |       0 | f
 public     | table4    | grpid       | bigint                  | none     | f       |       0 | f
 public     | table4    | grpname     | character varying(256)  | none     | f       |       0 | f
 public     | table4    | status      | character varying(256)  | none     | f       |       0 | f
 public     | table4    | type1       | character varying(256)  | none     | f       |       0 | f

encodingが列圧縮のモードです。
すべて「none」と散々な状態・・orz

列圧縮のモードは以下を参照してみて下さい。
AWS Documentation » Amazon Redshift » データベース開発者ガイド » テーブルの設計 » 列圧縮タイプの選択 » 圧縮エンコード

列圧縮のモードはCreateTable文で指定できます
例えば

Redshift
create table testtable1
(
  id int,
  text varchar(256) encode LZO
);

と指定すれば良い感じです。
指定しなくてもRedshiftがよしなに列圧縮モードを設定してくれるようですが
聞いた話では、COPYコマンドで流し込みを行ったときに自動で列圧縮モード指定が行われるが
insert文で1行1行インサートして入れた際はraw (非圧縮) になってしまうそうです。

列圧縮と聞くと、展開するときにCPUパワー使うから使いたくないという方もいるかと思いますが
その筋に方々は圧縮展開のCPUコストよりストレージからの読み込みバイト数によるIOコストのほうが格段に大きいので
列圧縮は大量データの高速化には最適という話も聞きます。
OLTPであれば少量のデータの読み書きが大量に発生しますが、
DWHでは書き込みはLOADで行い、それらのデータはたまにしか使わず、使う時は読み込みが大量!!・・
という使い方ですのでストレージの料金的なコストのほうを優先にしてもいいと思います。

ということで、encodedがNな非圧縮列ばかりのテーブルを見つけたら

1.同一内容の別名テーブルを用意(圧縮方法はしていしなくてもよい)
2.insert into 同一内容の別名テーブル名 select * from 元テーブル名 でさくっと内容を移す
3.一応count(*)をとったりsum()などの集計関数で値をもとめ内容が同じかを確認
4.元テーブルを削除、alter文で別名テーブル名のテーブル名を変更

と行うだけで感覚的にはテーブル容量が半分から3割程度に削減できます。

imaiworks
PHP好き好き大好き!やっぱ好き!
ayudante
いつもユーザー中心で技術者とコンサルタントがとことん考え抜く それがアユダンテです
https://ayudante.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした