web-dev-qa-db-ja.com

PostgresqlでいくつかのGINインデックスを同時に作成する方法

大きなテーブルがあります:CREATE TABLE hh(h int8[] not null, file int8 not null)、およびGIN-index over hフィールド(CREATE INDEX ON hh USING gin(h))。作成されたインデックスは約8分なので、この大きなテーブルを2つ以上のテーブルに分割し、このすべてのテーブルにインデックスを作成することにしました。

これらのインデックスは並行して作成され、約2倍のスピードアップが得られると想定しました(インデックスとテーブルが1つのディスクに配置されているため、わずかに少なくなります)。 2つのテーブルで4〜5分(1つのテーブルで10分ではなく)得られたと仮定しました。

しかし、それは起こりませんでした!両方のインデックスは、4〜5分ではなく、8〜9分を作成しました。

他の大きなテーブルよりもインデックスのBツリーを並列に作成しようとしていますが、PostgreSQLはそのようなインデックスを並列に作成できます。だから私はそれがGINでも機能すると思いました。

十分なRAMインデックス用:32GBRAM。元のテーブルのサイズは1Gb、元のインデックスのサイズは3Gbです。分割されたテーブルのサイズは0.5Gb、インデックスは1.3Gbサイズです。maintenance_work_mem = 16Gbwork_mem = 16Gb

また、2番目のテーブルとインデックスを別のテーブルスペース(別の物理ディスクにある)に配置しようとしましたが、加速は非常に小さかった(7.5分対8分)。なぜ??

では、GINインデックスを並行して作成する方法は?これは可能ですか?

1
Dmitry Krylov

私のコメントをフォローアップするために、PostgreSQLは絶対に異なるテーブル上に互いに並行してginインデックスを構築できます。メリットが見られない場合は、十分なリソースがないためです。おそらくランダムディスクIO容量、大きなginインデックスの構築は、これに非常に集中する可能性があるためです。

別の表スペースを使用しても速度が上がらない場合は、おそらくIOボトルネックがカーネルにあるか、FSコードであるため、処理に失敗します。基盤となるハードウェアの完全な利点。ボトルネックをより明確に判断する1つの方法は、同じマシンで2つの別々のPostgreSQLサーバーを実行し(異なるポートをリッスン)、各データベースサーバーに1つのテーブルを配置することです。その設定で同時にインデックスを作成してみてください。

1
jjanes