PostgreSQL 12即将到来!(外传1) – 对pg_bigm的影响
首先
我尝试使用pg_bigm来重新确认PostgreSQL 12的改进项目。
pg_bigm 是什么?
简单说,pg_bigm是一个在PostgreSQL中实现全文搜索的扩展模块。
PostgreSQL本身具有针对英文的形态素全文搜索功能。另外,作为针对英文的N-Gram全文搜索功能,也有一个名为pg_trgm的contrib扩展功能。
但遗憾的是,没有针对日文的N-Gram方式全文搜索功能。pg_bigm提供了针对日文的N-Gram方式全文搜索功能(全文搜索索引)。
个人认为,pg_bigm最显著的特点之一是仅需安装该模块,就能大幅提高LIKE中间匹配搜索的速度。这方面,最好看一下实例来更快理解。
PostgreSQL 12的改进项目
PostgreSQL 12 beta1于5月份发布,并且已经公开了发布说明。
https://www.postgresql.org/docs/devel/release-12.html
在那个发布说明中
减少GiST、GIN和SP-GiST索引创建时的WAL写入开销(Anastasia Lubennikova,Andrey V. Lepikhov)
在中文中,该句可以被表述为:关于这个项目,意在减少用于GIN索引生成的WAL大小,用于全文搜索索引等。关于此,我在发布PostgreSQL 12 beta1之前稍作了解(参见《PostgreSQL 12即将来临!(3) – GIN索引的WAL大小减少》),既然beta1也已发布,我决定再次确认它,作为使用N-gram方法的全文搜索索引中的一个实例,我会使用pg_bigm来实现。
本次的验证 cì de
-
- pg_bigmによってGINインデックスを作成するときのWALサイズをPostgreSQL 11とPostgreSQL 12で比較する。
-
- GINインデックス作成時間をPostgreSQL 11とPostgreSQL 12で比較する。
- (おまけ)pg_bigmによる全文検索処理時間を比較する。
主题
這次我們仍然使用青空文庫所謂的「吉川三國志」來源的文本。為什麼選擇這個呢?因為我單純喜歡三國志,而且這個文本資料的大小也適中。
粗略的步骤
-
- 青空文庫の吉川三国志テキストデータを、PostgreSQLにロードする。
-
- pg_bigmモジュールを組み込む。
-
- 一旦、PostgreSQLを停止させる。
-
- pg_resetwal ユーティリティを使ってWALを初期化する。
-
- PostgreSQLを再起動させる。このときのWALセグメントファイルの数や、LSNの位置を記録しておく。
-
- CREATE INDEXコマンドで、pg_bigmが提供するメソッドを用いてBi Bram(2文字に分解されたGIN転置インデックス)を作成する。そのときの時間をpsqlの \timing メタコマンドで測定しておく。
-
- インデックス作成後のWALセグメントファイルの数や、LSNの位置を記録しておく。
-
- ついでにインデックスサイズを測定しておく(バージョンによる違いはないはず)。
-
- この状態で、ついでに全文検索を3回実施して実行時間(EXPLAIN ANALYZEのEecution time)を測定しておく。
- 上記の手順を、PostgreSQL 11とPostgreSQL 12 beta1で実施する。
结果(在索引创建时的WAL大小)

结果(索引创建时间)
建立索引的时间如下所示。

如果要粗略地说创建索引所需的时间,那么就是非常短的。
-
- インデックス作成元になるテーブルのサイズ(読み込み時間)
-
- 作成されるインデックスのサイズ(書き込み時間)
-
- インデックス作成のWALサイズ(書き込み時間)
- その他(インデックス作成のためのCPU時間)
我认为可能会受到周围的影响。所以,我绘制了原始表的大小、生成的索引大小以及索引生成时的WAL大小来一起分析。

这样看来,考虑到WAL大小的差异,对生成时间的影响似乎比我想象的要小。也许索引创建本身的CPU处理比我想象的更繁重?
查询结果时间
由于生成的全文搜索索引内容应该不会改变,所以搜索时间也不应该有太大变化。但是,PostgreSQL 12版本感觉非常宽松,并在发布说明中列出了以下改进项目。
改善多字节字符的搜索性能(Heikki Linnakangas)
尽管我没有查看源代码等相关信息,无法确定这与使用pg_bigm全文搜索索引的搜索有多大关系,但我尝试执行以下查询(在缓存中)三次并计算其平均执行时间,以确认是否对pg_bigm的搜索性能产生影响。
EXPLAIN ANALYZE SELECT * FROM sangokushi WHERE data LIKE '%兀突骨%';
通过此查询,可以从《吉川三国志》这本由41747行组成的文本中获得13行的搜索结果。
以下是搜索时间的测量结果。尽管稍微有点,但在PostgreSQL 12中的搜索性能有所提高。

尽管我没有详细调查这个结果是否源于我提及的「改善多字节字符的搜索性能」,但至少可以说,在将pg_bigm应用于PostgreSQL 12环境后,并没有遇到大问题。
最后
-
- pg_bigmをPostgreSQL 12に適用しても大きな問題はなさげ。
- やっぱり吉川三国志は面白いなー。