大きなテーブルがあります: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 = 16Gb
、work_mem = 16Gb
。
また、2番目のテーブルとインデックスを別のテーブルスペース(別の物理ディスクにある)に配置しようとしましたが、加速は非常に小さかった(7.5分対8分)。なぜ??
では、GINインデックスを並行して作成する方法は?これは可能ですか?
私のコメントをフォローアップするために、PostgreSQL
は絶対に異なるテーブル上に互いに並行してgin
インデックスを構築できます。メリットが見られない場合は、十分なリソースがないためです。おそらくランダムディスクIO容量、大きなgin
インデックスの構築は、これに非常に集中する可能性があるためです。
別の表スペースを使用しても速度が上がらない場合は、おそらくIOボトルネックがカーネルにあるか、FSコードであるため、処理に失敗します。基盤となるハードウェアの完全な利点。ボトルネックをより明確に判断する1つの方法は、同じマシンで2つの別々のPostgreSQL
サーバーを実行し(異なるポートをリッスン)、各データベースサーバーに1つのテーブルを配置することです。その設定で同時にインデックスを作成してみてください。