-
2022-03-30 PostgreSQL全文検索
PostgreSQL の全文検索モジュール pg_bigm と PGroonga の速度比較(2)
pg_bigm と PGroonga の実行速度比較
本記事では PostgreSQL の全文検索モジュールである pg_bigm と PGroonga の速度を検証いたしましたので、結果を記載いたします(前回の検証はコチラです)。
検証用のデータとして、テキストデータを 10 万レコードと 50 万レコードの 2 パターン用意し、pg_bigm と PGroonga の全文検索 SQL の実行速度を計測しました。
各バージョンは下記の通りです。
- PostgreSQL 14.2
- pg_bigm 1.2
- PGroonga 2.3.6
用意したデータの内容
- 最小文字数:6 文字
- 最大文字数:578,911 文字
- 平均文字数:8,056 文字
文字数ごとのレコード件数をグラフにすると下記のようになります。
PostgreSQL オブジェクトのデータサイズ
データを格納した後の各 PostgreSQL オブジェクトのサイズは下記の通りです。
レコード件数 | テーブルサイズ | pg_bigm のインデックスサイズ | PGroonga のインデックスサイズ |
---|---|---|---|
100,000 件 | 805 MB | 675 MB | 2,347 MB |
500,000 件 | 4,023 MB | 2,646 MB | 11,487 MB |
・PGroonga のインデックスサイズは、pg_bigm のインデックスサイズの 4 倍程度のサイズとなりました。
※PGroonga の WAL を有効にしていない状態です。
全文検索 SQL 実行速度の検証
検索キーワードを 1 文字、 2 文字、3 文字、5 文字、8 文字、15 文字の 5 パターン分用意し、それぞれの実行速度を検証しました。
検索キーワードに関する情報は下記のとおりです。
検索キーワード文字数 | 検索キーワード | pg_bigm の該当レコード件数 | PGroonga の該当レコード件数 |
---|---|---|---|
1 | A | 1,085 件 | 37,195 件 |
2 | 企業 | 14,314 件 | 14,314 件 |
3 | テスト | 4,259 件 | 4,259 件 |
5 | インデックス | 522 件 | 522 件 |
8 | バージョンアップ | 296 件 | 296 件 |
15 | ヒューマンマシンインタフェース | 18 件 | 18 件 |
※該当レコード件数は、10 万件のレコードのうち、検索キーワードに該当するレコードの件数です。
※ PGroonga は大文字小文字を関係なく検索するので、1 文字検索時の該当レコード件数に相違が発生しています。
※本当は 15 文字ではなく 13 文字で検証したかったのですが、文字数を数え間違えていました・・。
pg_bigm と PGroonga の実行速度比較の結果
前置きが長くなりましたが、10 万レコードと 50 万レコードで pg_bigm と PGroonga で全文検索 SQL を実行した速度は下記のとおりとなりました。
※全データが PostgreSQL の共有バッファにキャッシュされた状態で実行速度を検証しました。
No | レコード件数 | 検索キーワード数 | pg_bigm の実行時間 | PGroonga の実行時間 |
---|---|---|---|---|
1 | 10万レコード | 1文字 | 10.11 ms | 110.56 ms |
2 | 10万レコード | 2文字 | 30.72 ms | 139.46 ms |
3 | 10万レコード | 3文字 | 2,645.09 ms | 147.52 ms |
4 | 10万レコード | 5文字 | 1,809.34 ms | 130.12 ms |
5 | 10万レコード | 8文字 | 1,321.72 ms | 75.70 ms |
6 | 10万レコード | 15文字 | 91.22 ms | 72.11 ms |
7 | 50万レコード | 1文字 | 40.18 ms | 262.56 ms |
8 | 50万レコード | 2文字 | 127.51 ms | 189.84 ms |
9 | 50万レコード | 3文字 | 10,975.58 ms | 174.58 ms |
10 | 50万レコード | 5文字 | 7,175.42 ms | 142.53 ms |
11 | 50万レコード | 8文字 | 5,858.23 ms | 144.00 ms |
12 | 50万レコード | 15文字 | 504.51 ms | 109.80 ms |
分かりやすくグラフにすると、下記のようになりました。
検証から分かったこと
- 検索キーワードが 2 文字以下の場合、pg_bigm の方が高速となりました。
- 上記表の No.1, 2, 7, 8
- 検索キーワードが 3 文字以上の場合は、PGroonga の方が高速となりました。
- 上記表の No.3, 4, 5, 6, 9, 10, 11, 12
- 10 万レコードの検索で、pg_bigm と PGroonga の速度差が最大となるのは、検索キーワード 3 文字の場合となりました。
- 上記表の No.3
- 2,497 ms = 約 2.5 sec の速度差
- 50 万レコードの検索でも、pg_bigm と PGroonga の速度差が最大となるのは、検索キーワード 3 文字の場合となりました。
- 上記表の No.9
- 10,801 ms = 約 10 sec の速度差
- 検索キーワードの文字数が多いほど、pg_bigm と PGroonga の速度差は小さくなりました。
- 速度差が小さくなる理由として、検索キーワードの文字数というよりも、検索結果の件数の方が関係していそうです。
おわりに
以上が pg_bigm と PGroonga の実行速度の比較となります。
記事内でもお伝えしましたとおり、検索キーワードに該当するレコード件数によって、pg_bigm の速度が変わってきそうです。
そのため、検索対象となるテキストデータの内容によって、本記事で検証した結果と違った実行速度となる可能性があることにご注意ください。
その辺りの、検索結果によって pg_bigm や PGroonga の実行速度が変化するか、ということについても今後の検証対象にしたいと考えています。