CREATE TABLEを調べてPostgreSQLと比べてみる
というわけで先日インストールしたコミュニティエディションからマニュアルを引っ張って読んでみる。
CREATE [[GLOBAL | LOCAL] {TEMPORARY | TEMP}] TABLE table_name ( [ { column_name data_type [DEFAULT default_expr] [column_constraint [ ... ]] | table_constraint | LIKE other_table [{INCLUDING | EXCLUDING} {DEFAULTS | CONSTRAINTS}] ...} [, ... ] ] ) [ INHERITS ( parent_table [, ... ] ) ] [ WITH ( storage_parameter=value [, ... ] ) [ ON COMMIT {PRESERVE ROWS | DELETE ROWS | DROP} ] [ TABLESPACE tablespace ] [ DISTRIBUTED BY (column, [ ... ] ) | DISTRIBUTED RANDOMLY ] [ PARTITION BY partition_type (column) [ SUBPARTITION BY partition_type (column) ] [ SUBPARTITION TEMPLATE ( template_spec ) ] [...] ( partition_spec ) | [ SUBPARTITION BY partition_type (column) ] [...] ( partition_spec [ ( subpartition_spec [(...)] )] )
LIKEも対応しているし、ぱっと見たところPostgreSQLのHEADと比べてもそんなに違いはなさそうに思いますが、どうなんでしょう。
DISTRIBUTED BY | DISTRIBUTED RANDOMLY は先日説明しましたが、Greenplum独特且つ最も気にするポイントです。
その下にPARTITION BYがありますね。さらにSUBPARTITION TEMPLATEとかあってもう目眩がしそうなので深くは突っ込みません。気になる方は是非インストールして試してね。しつこいようですがCommunity Editionと言えども機能に差はありませんので。
DISTRIBUTED BYがあるのでPARTIITON BYはいらないだろうと思ったそこのあなた、鋭い。私も最初はそう思いました。が、これが結構重要らしいんですね。テーブル毎に行指向と列指向を使い分けられるので、同一テーブルのパーティション毎に戦略を変えたり、不要になった古いログデータを一括で削除するなどはパーティションあっての操作です。追記のみテーブル(AppendOnly)とかもやるのでパーティションで削除するわけです。まとめると、分散(DISTRIBUTED)は物理的な配置を決めるのに対して、分割(PARTITION)は論理的な配置を決めているわけですね。
せっかくなのでもう少し。
where storage_parameter is: APPENDONLY={TRUE|FALSE} ORIENTATION={COLUMN|ROW} COMPRESSTYPE={ZLIB|QUICKLZ} COMPRESSLEVEL={0-9 | 1} FILLFACTOR={10-100} OIDS[=TRUE|FALSE]
ストレージパラメータのところで「追記のみ」「列指向」「圧縮種類」「圧縮レベル」「充填率」「OID」などを決められます。最後の二つはPostgreSQLにもあるので割愛しますが、それ以外はDWHでは結構重要な機能のような気がします。追記のみを選択することによってトランザクション処理ができなくなりますが、行ヘッダが省略されるのでテーブルサイズが小さくなります。列指向も最近流行のようですが、整数なら整数、文字列なら文字列というように同じ性質を持つデータが並ぶため圧縮率が高くなる傾向にあるようです。その他の二つもどのように圧縮するかのパラメータですね。何を指定するとどのぐらい圧縮されるかはデータにも依るとおもいますので、ぜひ自分で試してみてください。
というわけでPostgreSQLとは全然比較していないですがCREATE TABLEの構文について調べてみました。