はじめに
にゃーん。
今回は小ネタ。
MATERIALIZED VIEWから直接COPY TOできるようになった、という改善項目について調べてみました。
概要
Commitfest 2025-03でコミットされた項目である。
タイトル | COPY materialized view TO |
---|---|
Topic | Server Features |
Last modified | 2025-04-07 00:19:29 |
Emails | in BeginCopyTo make materialized view using COPY TO instead of COPY (query). |
MATERIALIZED VIEWからのCOPY TO
PostgreSQL 17まで
PostgreSQL 17まではMATERIALIZED VIEWから直接COPY TO
コマンドでファイルへの書き出しはできなかった。
以下のようなMATERIALIZED VIEWがある。
testdb=# \d pgbench_accounts_mv
Materialized view "public.pgbench_accounts_mv"
Column | Type | Collation | Nullable | Default
----------+---------------+-----------+----------+---------
aid | integer | | |
bid | integer | | |
abalance | integer | | |
filler | character(84) | | |
COPY TO
(テーブルからファイルやプログラムに書き出すモード)では、通常のテーブルまたはクエリ結果しか指定できない。
上記のMATERIALIZED VIEWを指定した場合にはエラーになる。
testdb=# COPY pgbench_accounts_mv TO '/tmp/mv.txt';
ERROR: cannot copy from materialized view "pgbench_accounts_mv"
HINT: Try the COPY (SELECT ...) TO variant.
とはいえ、HINTにあるように(SELECT ...)
(あるいはTABLE ...
)で代替はできるので、それほど大きな問題にはならない。
testdb=# COPY (TABLE pgbench_accounts_mv) TO '/tmp/mv.txt';
COPY 10000000
testdb=#
PostgreSQL 18
PostgreSQL 18では、COPY マテリアライズドビュー名 TO ...
でもCOPYができるようになった。
testdb=# \d pgbench_accounts_mv
Materialized view "public.pgbench_accounts_mv"
Column | Type | Collation | Nullable | Default
----------+---------------+-----------+----------+---------
aid | integer | | |
bid | integer | | |
abalance | integer | | |
filler | character(84) | | |
testdb=# COPY pgbench_accounts_mv TO '/tmp/mv.txt';
COPY 10000000
testdb=#
マテリアライズドビュー名指定と、クエリ指定の違い
さて、PostgreSQL 18ではCOPY TO
でマテリアライズドビュー名を指定可能になったが、結果としてはCOPY ( TABLE マテリアライズドビュー名 ) TO ...
と同じ内容のファイルが生成される。
では、マテリアライズドビュー名指定が可能になると何が嬉しいのか。
もちろんSQLの記述がちょっとだけ楽になるというのもあるが、どうやらクエリ指定したときよりも、直接マテリアライズドビュー指定するほうが、ちょっとだけ高速らしいのだ。
(議論のMLから引用)
generally COPY TO
COPY table
is faster thanCOPY (select * from table)
処理時間の比較方法
ということで試してみる。
-
pgbench -i -s 100
の指定でテーブル群を作成する。 - pgbench_accountsの内容そのままのマテリアライズドビューを作成する。
- そのマテリアライズドビューから
COPY TO
でテーブル内容をエクスポートする。- マテリアライズドビュー名を指定するパターン
- (TABLE マテリアライズドビュー)を指定するパターン
- 出力先は
/dev/null
にしておく(ファイル書き込み時間を無視するため)
- 各方式で3回ずつ実行した処理時間を集計する。
処理時間比較結果
マテリアライズドビュー名指定のほうが約4%程度、処理時間が短縮されている。
方式 | 平均処理時間(ms) | stdev |
---|---|---|
マテリアライズドビュー名指定 | 3623.172 | 26.520 |
クエリ指定 | 3500.035 | 17.257 |
4%程度なので劇的な処理時間の短縮というわけではないけど、非常に巨大なマテリアライズドビューから結果をエクスポートする場合にはありがたい改善になりそうだ。
おわりに
この改善によって
- MATERIALIZED VIEWから直接COPY TOできるようになった。
- 直接COPY TO指定することで少しエクスポートの処理時間が短縮可能
ということがわかりました。
地味な改善だけど、こういうことの積み重ねも大事なことですよね・・・。