0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PostgreSQL 18がやってくる(7) COPY materialized view TO

Last updated at Posted at 2025-04-30

はじめに

にゃーん。
今回は小ネタ。
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 TOCOPY table is faster than COPY (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指定することで少しエクスポートの処理時間が短縮可能

ということがわかりました。
地味な改善だけど、こういうことの積み重ねも大事なことですよね・・・。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?