約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