Rails/OSS パッチ会だった。オンライン開催になって、それなりに回数も経ってきたところ。
自分は仕事で bin/rails db:schema:load
の実行が遅いのが気にかかっていて、結構前に手元で試していた高速化のアイデアについて話したりしていた。
bin/rails db:schema:load
は内部的に db/schema.rb を load
しているだけなのでリニアに実行される。
そこで、ひとつの高速化アイデアとしてのキーワードは「並列化」。db/schema.rb のうち create_table do ... end
, add_foreign_key
のコードをそれぞれコレクションにして、1. create_table
のコレクションを (Parallel gem なんかで) パラレル実行、2. add_foreign_key
のコレクションをパラレル実行、最後に ActiveRecord::Schema.define
を実行するとかどうだろうというものだった。
手元にあるアプリケーションへのモンキーパッチによる PoC だと、前段のコレクションに詰める仕込み部分で db/schema.rb を RuboCop を使って AST プログラミングするという異能を使っている (のでこれで upstream に送ることはない) が、そこはさすがに method_missing
とか使うとかした方が良いだろうなどコメントをもらいながら話していた。
さらにその先の結論としては、MySQL なんかでの bin/rails db:schema:load
はそんなに遅くないらしく、どうも Oracle adapter のスキーマ処理まわりにボトルネックがありそうで、そちらを解決した方が良さそうというオチだった。まあ、そうですよね。