先月末からJSONファイルからDBに一括取り込みする処理の高速化をしています。 activerecord-importを使っていたので、つぎの方法を試しました。
- activerecord-importに渡すデータ生成のチューニング
- ActiveRecordインスタンスからハッシュに変更
- ActiveRecordインスタンスから配列に変更
- 代わりにActiveRecord#insert_allを使う
- 代わりにactiverecord-copyを使う
一向に速くなりません。 いよいよ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倍も遅くなる