Open3

Citus 10を試してみる

こばこば

環境構築・動作確認

公式ドキュメントのSingle-Node CitusにあるDockerでのCitus 10の起動を試す。

docker run自体はドキュメント通りに実行すればOK。
さらにaptでpostgresql-clientをインストールして接続してみる。

しかし、Ubuntu 18.02で試すとこちらのCitusブログのメタコマンドが通らない。
理由はpostgresql-clientのバージョンが10と古いから。

Citus Columnarを試すにはPostgreSQL 12以上、Citus 10以上という条件があるので、クライアントも12以上を入れる。
こちらの情報を参考にPostgreSQL公式のリポジトリを設定して、apt-get install postgresql-client-12でOK。

こばこば

CitusColumnarを試す

Citusのblogを参考にColumnarのテーブルを作ってみる。

postgres=# CREATE EXTENSION IF NOT EXISTS citus;
NOTICE:  extension "citus" already exists, skipping
CREATE EXTENSION
postgres=# CREATE TABLE simple_row(i INT8);
CREATE TABLE
postgres=# CREATE TABLE simple_columnar(i INT8) USING columnar;
CREATE TABLE
postgres=# \dt simple_columnar
              List of relations
 Schema |      Name       | Type  |  Owner   
--------+-----------------+-------+----------
 public | simple_columnar | table | postgres
(1 row)

postgres=# \d+ simple_row
                                Table "public.simple_row"
 Column |  Type  | Collation | Nullable | Default | Storage | Stats target | Description 
--------+--------+-----------+----------+---------+---------+--------------+-------------
 i      | bigint |           |          |         | plain   |              | 
Access method: heap
postgres=# \d+ simple_columnar
                             Table "public.simple_columnar"
 Column |  Type  | Collation | Nullable | Default | Storage | Stats target | Description 
--------+--------+-----------+----------+---------+---------+--------------+-------------
 i      | bigint |           |          |         | plain   |              | 
Access method: columnar

postgres=# INSERT INTO simple_row SELECT generate_series(1,100000);
INSERT 0 100000
postgres=# INSERT INTO simple_columnar SELECT generate_series(1,100000);
INSERT 0 100000
こばこば

HeapとColumnarの実行計画比較

実行計画と処理時間を確認してみる。

postgres=# explain analyze SELECT AVG(i) FROM simple_row;

                                                      QUERY PLAN                                                       
-----------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=1693.00..1693.01 rows=1 width=32) (actual time=17.897..17.898 rows=1 loops=1)
   ->  Seq Scan on simple_row  (cost=0.00..1443.00 rows=100000 width=8) (actual time=0.010..8.653 rows=100000 loops=1)
 Planning Time: 0.063 ms
 Execution Time: 17.942 ms
(4 rows)

explain analyze SELECT AVG(i) FROM simple_columnar;
                                                                 QUERY PLAN                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=264.04..264.05 rows=1 width=32) (actual time=24.427..24.429 rows=1 loops=1)
   ->  Custom Scan (ColumnarScan) on simple_columnar  (cost=0.00..14.04 rows=100000 width=8) (actual time=0.471..16.984 rows=100000 loops=1)
         Columnar Chunk Groups Removed by Filter: 0
 Planning Time: 0.132 ms
 Execution Time: 24.461 ms
(5 rows)

リレーションのサイズはColumnarの方が遥かに小さいのに。

postgres=# SELECT pg_total_relation_size('simple_row')::numeric as heap_size
postgres-#       ,pg_total_relation_size('simple_columnar') as columnar_size
postgres-#       ,pg_total_relation_size('simple_row')::numeric/pg_total_relation_size('simple_columnar') AS compression_ratio;
 heap_size | columnar_size |  compression_ratio  
-----------+---------------+---------------------
   3661824 |        139264 | 26.2941176470588235
(1 row)