第23回 PostgreSQLアンカンファレンス@オンライン
© 2021 NTT DATA Corporation
pg_bigmで全文検索するときに気を付けたい5つのポイント
2021年5月11日
株式会社NTTデータ 藤井 雅雄
© 2021 NTT DATA Corporation 2
2
© 2021 NTT DATA Corporation
自己紹介
藤井 雅雄
Database Technical Lead @ NTTデータ
データベース研究開発
PostgreSQL 技術支援
PostgreSQLコミッタ
レプリケーション
WAL圧縮
バックアップ進捗確認
pg_bigm(全文検索モジュール) コミッタ
@fujii_masao
© 2021 NTT DATA Corporation 3
3
© 2021 NTT DATA Corporation
本講演について
講演資料は、NTTデータのSlideShareアカウント上で公開予定です。
https://www.slideshare.net/nttdata-tech
講演資料に掲載の検証結果は、ノートPC上の簡易計測で取得したものです。
環境や条件などによっては、異なる検証結果になる可能性があるためご了承ください。
© 2021 NTT DATA Corporation 4
pg_bigmとは
PostgreSQL上で全文検索機能を提供するOSSモジュール
「OSS」を含むタイトルの書籍情報を検索したい!
SELECT * FROM book WHERE title LIKE ‘%OSS%’
シーケンシャル
スキャン
インデックス
スキャン
pg_bigm導入で高速に! 
通常、インデックス使えず低速
© 2021 NTT DATA Corporation 5
pg_bigmとは
開発元
pg_bigm Development Group
(もともとはNTTデータが開発)
ライセンス The PostgreSQL License
最新バージョン 1.2-20200228 (2020/2/28リリース)
動作確認環境
OS: Linux, Mac OS X
PostgreSQL: 9.1~13
公開先
(公式) https://pgbigm.osdn.jp
(ミラー) https://github.com/pgbigm/pg_bigm
v14開発版(2021/4/28時点)でも
動作を確認済!!
© 2021 NTT DATA Corporation 6
パブリッククラウドで広がるpg_bigmの採用
2020-08: ApsaraDB RDS for PostgreSQL / AliPG @ Alibaba Cloud
https://www.alibabacloud.com/help/ja/doc-detail/126002.htm
https://help.aliyun.com/document_detail/182266.html
2020-09: TencentDB for PostgreSQL @ Tencent Cloud
https://intl.cloud.tencent.com/jp/document/product/409/38832
https://intl.cloud.tencent.com/jp/document/product/409/7567
2021-04: Amazon RDS for PostgreSQL @ AWS
https://aws.amazon.com/jp/about-aws/whats-new/2021/04/amazon-rds-for-postgresql-
supports-pg-bigm-extension-for-faster-full-text-search/
© 2021 NTT DATA Corporation 7
pg_bigmの参考情報
pg_bigmを用いた全文検索のしくみ(前編)
https://www.slideshare.net/hadoopxnttdata/pgbigm-39739489
pg_bigmを用いた全文検索のしくみ(後編)
https://www.slideshare.net/hadoopxnttdata/pgbigm-39739507
PostgreSQLでpg_bigmを使って日本語全文検索
https://www.slideshare.net/hadoopxnttdata/postgresqlpgbigm-mysqlpostgresql
pg_bigmを触り始めた人に伝えたいこと
https://www.slideshare.net/masahikosawada98/pgbigm-66639454
pg_bigmと類似度検索
https://www.slideshare.net/masahikosawada98/pgbigm-66639588
© 2021 NTT DATA Corporation 8
pg_bigmで気を付けたい5つのポイント
© 2021 NTT DATA Corporation 9
1. 完全一致検索や前方一致検索にはB-treeの利用も検討すべき
日本版Wikipediaタイトル一覧データ約374万件から、
完全一致検索および前方一致検索したときの実行時間の比較
完全一致検索 前方一致検索
インデックスなし
(Seq Scan)
265.72 ms 283.37 ms
インデックスなし
(Parallel Seq Scan)
117.92 ms 117.08 ms
pg_bigmインデックス
(Bitmap Index Scan)
2.90 ms 2.00 ms
B-treeインデックス
(Index Scan)
0.59 ms 0.58 ms
B-treeインデックス
(Index Only Scan)
0.34 ms 0.44 ms
完全一致検索
下記SQLで検索結果3件
SELECT * FROM jawiki
WHERE title = 'データベース';
※pg_bigmでは=の代わりにLIKEを使用
前方一致検索
下記SQLで検索結果50件
SELECT * FROM jawiki
WHERE title LIKE 'データベース%';
pg_bigmもそこそこ高速だが、
B-treeのほうが高性能
© 2021 NTT DATA Corporation 10
2. Recheck処理のオーバーヘッドが発生する
東京都
東京と京都
東京都
Recheck処理
検索文字列が3文字以上の場合、Recheck処理により
pg_bigmインデックスから絞り込んだ検索結果候補が妥当か検査しなければならない
'%東京都%'で検索
検索結果候補の数が多いほど、データサイズが大きいほど、
Recheck処理のオーバーヘッドは大きくなる
「東京」と「京都」でインデックス
から検索結果候補を絞り込み
検索結果候補のデータをすべてチェックして、
検索条件を満たすものを抽出する
© 2021 NTT DATA Corporation 11
2. Recheck処理のオーバーヘッドが発生する
Recheck
あり
Bitmap Heap Scan on jawiki (actual time=0.979..2.636 rows=3678 loops=1)
Recheck Cond: (title ~~ '%東京都%'::text)
Rows Removed by Index Recheck: 10
Heap Blocks: exact=822
-> Bitmap Index Scan on jawiki_bigm (actual time=0.863..0.864 rows=3688 loops=1)
Index Cond: (title ~~ '%東京都%'::text)
Planning Time: 0.065 ms
Execution Time: 2.931 ms
Recheck
なし(*1)
Bitmap Heap Scan on jawiki (actual time=1.250..2.499 rows=3688 loops=1)
Recheck Cond: (title ~~ '%東京都%'::text)
Heap Blocks: exact=822
-> Bitmap Index Scan on jawiki_bigm (actual time=1.129..1.130 rows=3688 loops=1)
Index Cond: (title ~~ '%東京都%'::text)
Planning Time: 0.086 ms
Execution Time: 2.793 ms
日本版Wikipediaタイトル一覧データ約374万件から全文検索したときの実行プラン
EXPLAIN ANALYZE SELECT * FROM jawiki WHERE title LIKE '%東京都%';
(*1) pg_bigm.enable_recheck=off
検索結果候補3688件から、
Recheckにより10件を除去
検索対象文字列が平均22Bと小さいため、
Recheck処理のオーバーヘッドは小さい
© 2021 NTT DATA Corporation 12
2. Recheck処理のオーバーヘッドが発生する
Recheck
あり
Bitmap Heap Scan on pgdocs (actual time=0.473..44.468 rows=352 loops=1)
Recheck Cond: (contents ~~ '%PostgreSQL%'::text)
Heap Blocks: exact=14
-> Bitmap Index Scan on pgdocs_bigm (actual time=0.247..0.247 rows=352 loops=1)
Index Cond: (contents ~~ '%PostgreSQL%'::text)
Planning Time: 0.111 ms
Execution Time: 44.536 ms
Recheck
なし
Bitmap Heap Scan on pgdocs (actual time=0.274..0.393 rows=352 loops=1)
Recheck Cond: (contents ~~ '%PostgreSQL%'::text)
Heap Blocks: exact=14
-> Bitmap Index Scan on pgdocs_bigm (actual time=0.258..0.258 rows=352 loops=1)
Index Cond: (contents ~~ '%PostgreSQL%'::text)
Planning Time: 0.115 ms
Execution Time: 0.494 ms
PostgreSQL日本語ドキュメントの各ソースファイルを格納したテーブルから、全文検索したときの実行プラン
EXPLAIN ANALYZE SELECT * FROM pgdocs WHERE contents LIKE '%PostgreSQL%';
検索対象文字列が平均51kBと大きく、
Recheck処理のオーバーヘッドが大きい
© 2021 NTT DATA Corporation 13
3. 英字/数字のみの全文検索にはpg_trgmの利用も検討すべき
pg_
bigm
Bitmap Heap Scan on uuid (actual time=129.772..129.931 rows=8 loops=1)
Recheck Cond: (id ~~ '%2f1da6%'::text)
Rows Removed by Index Recheck: 183
Heap Blocks: exact=191
-> Bitmap Index Scan on uuid_bigm (actual time=129.714..129.714 rows=191 loops=1)
Index Cond: (id ~~ '%2f1da6%'::text)
Planning Time: 0.143 ms
Execution Time: 129.969 ms
pg_
trgm
Bitmap Heap Scan on uuid (actual time=10.219..10.232 rows=8 loops=1)
Recheck Cond: (id ~~ '%2f1da6%'::text)
Rows Removed by Index Recheck: 1
Heap Blocks: exact=9
-> Bitmap Index Scan on uuid_trgm (actual time=10.207..10.207 rows=9 loops=1)
Index Cond: (id ~~ '%2f1da6%'::text)
Planning Time: 0.105 ms
Execution Time: 10.261 ms
gen_random_uuid()で作成したUUIDデータ1千万件から、全文検索したときの実行プラン
EXPLAIN ANALYZE SELECT * FROM uuid WHERE id LIKE '%2f1da6%';
検索対象文字列の文字種別が少ない場合は、
3文字区切りのpg_trgmのほうが
インデックスから結果を絞り込みやすい
© 2021 NTT DATA Corporation 14
14
© 2021 NTT DATA Corporation
4. シンプルな全文検索のみ可能
=# CREATE INDEX testidx ON test
USING gin (normalize(col, NFKC) gin_bigm_ops);
=# SELECT * FROM test
WHERE normalize(col, NFKC)
LIKE likequery(normalize('PostgreSQLバージョン13', NFKC));
col
--------------------------------------------
PostgreSQLバージョン13の新機能
PostgreSQLバージョン13の新機能
PostgreSQLバージョン⑬の新機能
PostgreSQLバージョン13の新機能
(4 rows)
全文検索インデックスの作成時と
検索時にnormalize関数を指定
英数字・カタカナの全角半角や記号の区別なく
全文検索が可能に!
高度な全文検索を実現するには、関数などと組み合わせてpg_bigmを使う。
例えば、文字の種別を意識しない全文検索をするにはnormalize関数と組み合わせる
© 2021 NTT DATA Corporation 15
FASTUPDATE = OFF FASTUPDATE = ON (デフォルト設定)
更
新
時
検
索
時
5. GINインデックスのFASTUPDATEパラメータについて検討すべき
GIN GIN
pending list
GIN
スキャン スキャン スキャン
大量のキーをGINイン
デックスに追加するため、
更新は低速になりがち
GINインデックスのみを
スキャンするため、
検索は高速
大量のキーをリストに追加する
だけのため、更新は高速。リス
ト内のキーはVACUUM時など
にGINインデックスに一括移動
GINインデックスとリストを
スキャンするため、
リスト内のキーが多いほど
検索は低速になりがち
最大で、リストの最大サイズ(gin_pending_list_limit)分のスキャンのオーバーヘッドが追加発生。
検索を優先したい場合は、FASTUPDATEを無効化するか、検索時に大量のキーがリストに残っていないように
VACUUMなどの実行頻度・契機を調整する
FASTUPDATEパラメータの設定値により、更新・検索性能の傾向が変わる
© 2021 NTT DATA Corporation 16
5. GINインデックスのFASTUPDATEパラメータについて検討すべき
FASTUPDATE
=off
または
FASTUPDATE
=onでリストが空
Bitmap Heap Scan on jawiki (actual time=0.979..2.636 rows=3678 loops=1)
Recheck Cond: (title ~~ '%東京都%'::text)
Rows Removed by Index Recheck: 10
Heap Blocks: exact=822
-> Bitmap Index Scan on jawiki_bigm (actual time=0.863..0.864 rows=3688 loops=1)
Index Cond: (title ~~ '%東京都%'::text)
Planning Time: 0.065 ms
Execution Time: 2.931 ms
FASTUPDATE
=onでリスト内に
約374万件の
キーが存在
Bitmap Heap Scan on jawiki (actual time=903.286..904.517 rows=3678 loops=1)
Recheck Cond: (title ~~ '%東京都%'::text)
Rows Removed by Index Recheck: 10
Heap Blocks: exact=822
-> Bitmap Index Scan on jawiki_bigm (actual time=903.194..903.194 rows=3688 loops=1)
Index Cond: (title ~~ '%東京都%'::text)
Planning Time: 0.134 ms
Execution Time: 904.738 ms
日本版Wikipediaタイトル一覧データ約374万件から全文検索したときの実行プラン
EXPLAIN ANALYZE SELECT * FROM jawiki WHERE title LIKE '%東京都%';
© 2021 NTT DATA Corporation 17
pg_bigmのよいところ
日本語全文検索でも高速
1文字、2文字の全文検索でも高速
LIKE検索でインデックスを利用できる
GINインデックスをそのまま利用のため、
- PostgreSQLの機能をサポート(WAL、リカバリ、レプリケーションなど)
- PostgreSQLの新機能もすぐにサポート
(v13リリース直後から新機能パラレルVACUUMに対応など)
- インデックスの信頼性が高い
一部のパブリッククラウドのマネージドDBサービスでも利用できる New!
© 2021 NTT DATA Corporation 18
さいごに
5つのポイントに気を付けながら、
pg_bigmでの全文検索をぜひお試しいただければ!!
1. 完全一致検索や前方一致検索にはB-treeの利用も検討すべき
2. Recheck処理のオーバーヘッドが発生する
3. 英字/数字のみの全文検索にはpg_trgmの利用も検討すべき
4. シンプルな全文検索のみ可能
5. GINインデックスのFASTUPDATEパラメータについて検討すべき
© 2021 NTT DATA Corporation
その他、記載されている会社名、商品名、又はサービス名は、
各社の登録商標又は商標です。
© 2021 NTT DATA Corporation 20
YouTubeチャンネル “NTT DATA Tech”
技術取り組み、活用情報を中心にお届けします
https://www.youtube.com/NTTDATATech

pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)

  • 1.
    第23回 PostgreSQLアンカンファレンス@オンライン © 2021NTT DATA Corporation pg_bigmで全文検索するときに気を付けたい5つのポイント 2021年5月11日 株式会社NTTデータ 藤井 雅雄
  • 2.
    © 2021 NTTDATA Corporation 2 2 © 2021 NTT DATA Corporation 自己紹介 藤井 雅雄 Database Technical Lead @ NTTデータ データベース研究開発 PostgreSQL 技術支援 PostgreSQLコミッタ レプリケーション WAL圧縮 バックアップ進捗確認 pg_bigm(全文検索モジュール) コミッタ @fujii_masao
  • 3.
    © 2021 NTTDATA Corporation 3 3 © 2021 NTT DATA Corporation 本講演について 講演資料は、NTTデータのSlideShareアカウント上で公開予定です。 https://www.slideshare.net/nttdata-tech 講演資料に掲載の検証結果は、ノートPC上の簡易計測で取得したものです。 環境や条件などによっては、異なる検証結果になる可能性があるためご了承ください。
  • 4.
    © 2021 NTTDATA Corporation 4 pg_bigmとは PostgreSQL上で全文検索機能を提供するOSSモジュール 「OSS」を含むタイトルの書籍情報を検索したい! SELECT * FROM book WHERE title LIKE ‘%OSS%’ シーケンシャル スキャン インデックス スキャン pg_bigm導入で高速に!  通常、インデックス使えず低速
  • 5.
    © 2021 NTTDATA Corporation 5 pg_bigmとは 開発元 pg_bigm Development Group (もともとはNTTデータが開発) ライセンス The PostgreSQL License 最新バージョン 1.2-20200228 (2020/2/28リリース) 動作確認環境 OS: Linux, Mac OS X PostgreSQL: 9.1~13 公開先 (公式) https://pgbigm.osdn.jp (ミラー) https://github.com/pgbigm/pg_bigm v14開発版(2021/4/28時点)でも 動作を確認済!!
  • 6.
    © 2021 NTTDATA Corporation 6 パブリッククラウドで広がるpg_bigmの採用 2020-08: ApsaraDB RDS for PostgreSQL / AliPG @ Alibaba Cloud https://www.alibabacloud.com/help/ja/doc-detail/126002.htm https://help.aliyun.com/document_detail/182266.html 2020-09: TencentDB for PostgreSQL @ Tencent Cloud https://intl.cloud.tencent.com/jp/document/product/409/38832 https://intl.cloud.tencent.com/jp/document/product/409/7567 2021-04: Amazon RDS for PostgreSQL @ AWS https://aws.amazon.com/jp/about-aws/whats-new/2021/04/amazon-rds-for-postgresql- supports-pg-bigm-extension-for-faster-full-text-search/
  • 7.
    © 2021 NTTDATA Corporation 7 pg_bigmの参考情報 pg_bigmを用いた全文検索のしくみ(前編) https://www.slideshare.net/hadoopxnttdata/pgbigm-39739489 pg_bigmを用いた全文検索のしくみ(後編) https://www.slideshare.net/hadoopxnttdata/pgbigm-39739507 PostgreSQLでpg_bigmを使って日本語全文検索 https://www.slideshare.net/hadoopxnttdata/postgresqlpgbigm-mysqlpostgresql pg_bigmを触り始めた人に伝えたいこと https://www.slideshare.net/masahikosawada98/pgbigm-66639454 pg_bigmと類似度検索 https://www.slideshare.net/masahikosawada98/pgbigm-66639588
  • 8.
    © 2021 NTTDATA Corporation 8 pg_bigmで気を付けたい5つのポイント
  • 9.
    © 2021 NTTDATA Corporation 9 1. 完全一致検索や前方一致検索にはB-treeの利用も検討すべき 日本版Wikipediaタイトル一覧データ約374万件から、 完全一致検索および前方一致検索したときの実行時間の比較 完全一致検索 前方一致検索 インデックスなし (Seq Scan) 265.72 ms 283.37 ms インデックスなし (Parallel Seq Scan) 117.92 ms 117.08 ms pg_bigmインデックス (Bitmap Index Scan) 2.90 ms 2.00 ms B-treeインデックス (Index Scan) 0.59 ms 0.58 ms B-treeインデックス (Index Only Scan) 0.34 ms 0.44 ms 完全一致検索 下記SQLで検索結果3件 SELECT * FROM jawiki WHERE title = 'データベース'; ※pg_bigmでは=の代わりにLIKEを使用 前方一致検索 下記SQLで検索結果50件 SELECT * FROM jawiki WHERE title LIKE 'データベース%'; pg_bigmもそこそこ高速だが、 B-treeのほうが高性能
  • 10.
    © 2021 NTTDATA Corporation 10 2. Recheck処理のオーバーヘッドが発生する 東京都 東京と京都 東京都 Recheck処理 検索文字列が3文字以上の場合、Recheck処理により pg_bigmインデックスから絞り込んだ検索結果候補が妥当か検査しなければならない '%東京都%'で検索 検索結果候補の数が多いほど、データサイズが大きいほど、 Recheck処理のオーバーヘッドは大きくなる 「東京」と「京都」でインデックス から検索結果候補を絞り込み 検索結果候補のデータをすべてチェックして、 検索条件を満たすものを抽出する
  • 11.
    © 2021 NTTDATA Corporation 11 2. Recheck処理のオーバーヘッドが発生する Recheck あり Bitmap Heap Scan on jawiki (actual time=0.979..2.636 rows=3678 loops=1) Recheck Cond: (title ~~ '%東京都%'::text) Rows Removed by Index Recheck: 10 Heap Blocks: exact=822 -> Bitmap Index Scan on jawiki_bigm (actual time=0.863..0.864 rows=3688 loops=1) Index Cond: (title ~~ '%東京都%'::text) Planning Time: 0.065 ms Execution Time: 2.931 ms Recheck なし(*1) Bitmap Heap Scan on jawiki (actual time=1.250..2.499 rows=3688 loops=1) Recheck Cond: (title ~~ '%東京都%'::text) Heap Blocks: exact=822 -> Bitmap Index Scan on jawiki_bigm (actual time=1.129..1.130 rows=3688 loops=1) Index Cond: (title ~~ '%東京都%'::text) Planning Time: 0.086 ms Execution Time: 2.793 ms 日本版Wikipediaタイトル一覧データ約374万件から全文検索したときの実行プラン EXPLAIN ANALYZE SELECT * FROM jawiki WHERE title LIKE '%東京都%'; (*1) pg_bigm.enable_recheck=off 検索結果候補3688件から、 Recheckにより10件を除去 検索対象文字列が平均22Bと小さいため、 Recheck処理のオーバーヘッドは小さい
  • 12.
    © 2021 NTTDATA Corporation 12 2. Recheck処理のオーバーヘッドが発生する Recheck あり Bitmap Heap Scan on pgdocs (actual time=0.473..44.468 rows=352 loops=1) Recheck Cond: (contents ~~ '%PostgreSQL%'::text) Heap Blocks: exact=14 -> Bitmap Index Scan on pgdocs_bigm (actual time=0.247..0.247 rows=352 loops=1) Index Cond: (contents ~~ '%PostgreSQL%'::text) Planning Time: 0.111 ms Execution Time: 44.536 ms Recheck なし Bitmap Heap Scan on pgdocs (actual time=0.274..0.393 rows=352 loops=1) Recheck Cond: (contents ~~ '%PostgreSQL%'::text) Heap Blocks: exact=14 -> Bitmap Index Scan on pgdocs_bigm (actual time=0.258..0.258 rows=352 loops=1) Index Cond: (contents ~~ '%PostgreSQL%'::text) Planning Time: 0.115 ms Execution Time: 0.494 ms PostgreSQL日本語ドキュメントの各ソースファイルを格納したテーブルから、全文検索したときの実行プラン EXPLAIN ANALYZE SELECT * FROM pgdocs WHERE contents LIKE '%PostgreSQL%'; 検索対象文字列が平均51kBと大きく、 Recheck処理のオーバーヘッドが大きい
  • 13.
    © 2021 NTTDATA Corporation 13 3. 英字/数字のみの全文検索にはpg_trgmの利用も検討すべき pg_ bigm Bitmap Heap Scan on uuid (actual time=129.772..129.931 rows=8 loops=1) Recheck Cond: (id ~~ '%2f1da6%'::text) Rows Removed by Index Recheck: 183 Heap Blocks: exact=191 -> Bitmap Index Scan on uuid_bigm (actual time=129.714..129.714 rows=191 loops=1) Index Cond: (id ~~ '%2f1da6%'::text) Planning Time: 0.143 ms Execution Time: 129.969 ms pg_ trgm Bitmap Heap Scan on uuid (actual time=10.219..10.232 rows=8 loops=1) Recheck Cond: (id ~~ '%2f1da6%'::text) Rows Removed by Index Recheck: 1 Heap Blocks: exact=9 -> Bitmap Index Scan on uuid_trgm (actual time=10.207..10.207 rows=9 loops=1) Index Cond: (id ~~ '%2f1da6%'::text) Planning Time: 0.105 ms Execution Time: 10.261 ms gen_random_uuid()で作成したUUIDデータ1千万件から、全文検索したときの実行プラン EXPLAIN ANALYZE SELECT * FROM uuid WHERE id LIKE '%2f1da6%'; 検索対象文字列の文字種別が少ない場合は、 3文字区切りのpg_trgmのほうが インデックスから結果を絞り込みやすい
  • 14.
    © 2021 NTTDATA Corporation 14 14 © 2021 NTT DATA Corporation 4. シンプルな全文検索のみ可能 =# CREATE INDEX testidx ON test USING gin (normalize(col, NFKC) gin_bigm_ops); =# SELECT * FROM test WHERE normalize(col, NFKC) LIKE likequery(normalize('PostgreSQLバージョン13', NFKC)); col -------------------------------------------- PostgreSQLバージョン13の新機能 PostgreSQLバージョン13の新機能 PostgreSQLバージョン⑬の新機能 PostgreSQLバージョン13の新機能 (4 rows) 全文検索インデックスの作成時と 検索時にnormalize関数を指定 英数字・カタカナの全角半角や記号の区別なく 全文検索が可能に! 高度な全文検索を実現するには、関数などと組み合わせてpg_bigmを使う。 例えば、文字の種別を意識しない全文検索をするにはnormalize関数と組み合わせる
  • 15.
    © 2021 NTTDATA Corporation 15 FASTUPDATE = OFF FASTUPDATE = ON (デフォルト設定) 更 新 時 検 索 時 5. GINインデックスのFASTUPDATEパラメータについて検討すべき GIN GIN pending list GIN スキャン スキャン スキャン 大量のキーをGINイン デックスに追加するため、 更新は低速になりがち GINインデックスのみを スキャンするため、 検索は高速 大量のキーをリストに追加する だけのため、更新は高速。リス ト内のキーはVACUUM時など にGINインデックスに一括移動 GINインデックスとリストを スキャンするため、 リスト内のキーが多いほど 検索は低速になりがち 最大で、リストの最大サイズ(gin_pending_list_limit)分のスキャンのオーバーヘッドが追加発生。 検索を優先したい場合は、FASTUPDATEを無効化するか、検索時に大量のキーがリストに残っていないように VACUUMなどの実行頻度・契機を調整する FASTUPDATEパラメータの設定値により、更新・検索性能の傾向が変わる
  • 16.
    © 2021 NTTDATA Corporation 16 5. GINインデックスのFASTUPDATEパラメータについて検討すべき FASTUPDATE =off または FASTUPDATE =onでリストが空 Bitmap Heap Scan on jawiki (actual time=0.979..2.636 rows=3678 loops=1) Recheck Cond: (title ~~ '%東京都%'::text) Rows Removed by Index Recheck: 10 Heap Blocks: exact=822 -> Bitmap Index Scan on jawiki_bigm (actual time=0.863..0.864 rows=3688 loops=1) Index Cond: (title ~~ '%東京都%'::text) Planning Time: 0.065 ms Execution Time: 2.931 ms FASTUPDATE =onでリスト内に 約374万件の キーが存在 Bitmap Heap Scan on jawiki (actual time=903.286..904.517 rows=3678 loops=1) Recheck Cond: (title ~~ '%東京都%'::text) Rows Removed by Index Recheck: 10 Heap Blocks: exact=822 -> Bitmap Index Scan on jawiki_bigm (actual time=903.194..903.194 rows=3688 loops=1) Index Cond: (title ~~ '%東京都%'::text) Planning Time: 0.134 ms Execution Time: 904.738 ms 日本版Wikipediaタイトル一覧データ約374万件から全文検索したときの実行プラン EXPLAIN ANALYZE SELECT * FROM jawiki WHERE title LIKE '%東京都%';
  • 17.
    © 2021 NTTDATA Corporation 17 pg_bigmのよいところ 日本語全文検索でも高速 1文字、2文字の全文検索でも高速 LIKE検索でインデックスを利用できる GINインデックスをそのまま利用のため、 - PostgreSQLの機能をサポート(WAL、リカバリ、レプリケーションなど) - PostgreSQLの新機能もすぐにサポート (v13リリース直後から新機能パラレルVACUUMに対応など) - インデックスの信頼性が高い 一部のパブリッククラウドのマネージドDBサービスでも利用できる New!
  • 18.
    © 2021 NTTDATA Corporation 18 さいごに 5つのポイントに気を付けながら、 pg_bigmでの全文検索をぜひお試しいただければ!! 1. 完全一致検索や前方一致検索にはB-treeの利用も検討すべき 2. Recheck処理のオーバーヘッドが発生する 3. 英字/数字のみの全文検索にはpg_trgmの利用も検討すべき 4. シンプルな全文検索のみ可能 5. GINインデックスのFASTUPDATEパラメータについて検討すべき
  • 19.
    © 2021 NTTDATA Corporation その他、記載されている会社名、商品名、又はサービス名は、 各社の登録商標又は商標です。
  • 20.
    © 2021 NTTDATA Corporation 20 YouTubeチャンネル “NTT DATA Tech” 技術取り組み、活用情報を中心にお届けします https://www.youtube.com/NTTDATATech

Editor's Notes

  • #21 情報発信については、NTT DATA Tech という YouTubeチャンネルを開設しました。 10月に開催したNTTデータ テクノロジーカンファレンスの模様や 技術トピックの解説映像などを、順次公開していきます。 こちらもあわせてご覧ください。