@ledsun blog

無味の味は佳境に入らざればすなわち知れず

PostgreSQLのインデックスが肥大化するとInsertがおそくなる

先月末からJSONファイルからDBに一括取り込みする処理の高速化をしています。 activerecord-importを使っていたので、つぎの方法を試しました。

一向に速くなりません。 いよいよpg_bulkloadコマンドを使うしかないか?と調べていました。

pg_bulkloadの性能測定(PostgreSQL12) - Qiita

COPYコマンドでロードする場合、インデックスは後から作成した方が高速です。

PostgreSQLのCOPYコマンドはインデックスの有無の影響を受けるようです。 試しにインデックスを削除してみました。 ガッと速くなりました。

ledsun@MSI:~/pubannotation►THOR_SILENCE_DEPRECATION=1 bin/rails runner ./bench_instantiate_and_save_annotations_coll
ection.rb tmp/upload-test-project-2022-06-24-15-05-36/db/litcovid/litcovid2pubtator-2020-11-17-17-47/PMC-7646410.jso
n
       user     system      total        real
3  1.829690   0.336547   2.166237 (  3.516013)

変更前は120秒掛かっていました。

ledsun@MSI:~/pubannotation►THOR_SILENCE_DEPRECATION=1 bin/rails runner ./bench_instantiate_and_save_annotations_collection.rb tmp/upload-test-project-2022-06-24-15-05-36/db/litcovid/l
itcovid2pubtator-2020-11-17-17-47/PMC-7646410.json
       user     system      total        real
3  4.286626   0.295670   4.582296 (120.652393)

34倍速くなりました。

再度インデックスを作り直しても速いままです。 気がついてみれば「インデックスをメンテナンスしないとDBが遅くなる」は確かにありそうな話です。次の点は予想外でした。

  • たかだか80万件のDelete/Insertしかしていない開発環境でもおきる
  • 2~3倍でなく30倍も遅くなる