5
1

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の新機能「GINインデックスのパラレル作成」の簡易性能検証

Last updated at Posted at 2025-06-18

約430万件の日本語Wikipediaタイトルデータを使って、pg_bigmによる(GINインデックスベースの)全文検索インデックスの作成時間を計測します。PostgreSQL 17以前のように1プロセスで作成する場合と、PostgreSQL 18で導入された「GINインデックスのパラレル作成」を使った場合とで、どれだけ時間に違いが出るかを比較します。

結果

GINインデックスのパラレル作成により、インデックス作成時間を半分以下に短縮!

パラレル度 インデックス作成時間 補足
1 66512.356 ms (01:06.512)
5 28669.585 ms (00:28.670) パラレルワーカーが4つ起動され、バックエンドと合わせて合計5多重でインデックスをパラレル作成)

計測方法

psqlで以下を実行します。

-- psqlの時間計測機能を有効化
\timing on

-- 日本語Wikipediaタイトルデータをダウンロードして解凍
\! wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles.gz
\! gunzip -d jawiki-latest-all-titles.gz

-- 日本語Wikipediaタイトルデータを格納するテーブルを作成
CREATE TABLE wikipedia_title (title text);

-- 日本語Wikipediaタイトルデータをテーブルにロード
-- * タイトルデータは、タブ区切りでpage_namespaceとpage_titleの2つのフィールドがあり、今回はpage_titleのみロード
-- * タイトルデータは、先頭業がヘッダ情報のため、\copyではheaderオプションを指定
\copy wikipedia_title from program 'cut -f2- jawiki-latest-all-titles' header

-- pg_bigmを登録
CREATE EXTENSION pg_bigm;

-- max_parallel_maintenance_workersを0に設定して、1プロセスでのインデックス作成時間を計測
SET max_parallel_maintenance_workers TO 0;
CREATE INDEX wikipedia_title_idx ON wikipedia_title USING gin (title gin_bigm_ops);

-- 3回インデックス作成した時の時間は以下の通り
-- Time: 67314.715 ms (01:07.315)
-- Time: 66512.356 ms (01:06.512)
-- Time: 66541.476 ms (01:06.541)

-- max_parallel_maintenance_workersを8に設定して、パラレルでの(実際には5多重での)インデックス作成時間を計測
SET max_parallel_maintenance_workers TO 8;
CREATE INDEX wikipedia_title_idx ON wikipedia_title USING gin (title gin_bigm_ops);

-- 3回インデックス作成した時の時間は以下の通り
-- Time: 28510.586 ms (00:28.511)
-- Time: 29249.084 ms (00:29.249)
-- Time: 28669.585 ms (00:28.670)

GINインデックスのパラレル作成時のpsの様子

USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
postgres 27860  99.3  3.2 36057372 541108   ??  Rs    3:42AM   3:58.95 postgres: postgres postgres [local] CREATE INDEX  
postgres 35437 100.0  0.4 36002944  66028   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860   
postgres 35438  99.3  0.4 36001916  66692   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860   
postgres 35439 100.0  0.4 36001720  65740   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860   
postgres 35440 100.0  0.4 35999704  66644   ??  Rs    3:50AM   0:06.89 postgres: parallel worker for PID 27860
5
1
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
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?