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)