Rails 7: スキーマキャッシュが遅延読み込み可能になった(翻訳)
Railsの基本操作は緊密に編成されたRailtiesのセットによって行われます。データベースコネクション用の情報読み込みもRailtiesの機能のひとつが担当しており、アプリケーション起動時にSQLのSHOW FULL FIELDS
クエリによって行われます。しかしこの操作は非常に高コストです。
これによって、複数のサーバーにまたがって動作するアプリケーションでパフォーマンスが著しく悪化する可能性があります。Railsはこのような場合にコストの高いSHOW FULL FIELDS
クエリの利用を回避するためのスキーマキャッシュを提供しています。このキャッシュファイルは、Railsから読み取り可能な単なるファイルであり、ここにスキーマ情報が含まれます。このファイルはrails db:schema:cache:dump
コマンドで生成できます。
改修前
Railsがスキーマキャッシュを読み込むのはアプリケーションの起動時です。この操作は非常に高コストですが、読み込み時に1度しか実行されないので管理可能です。いったん読み込まれたスキーマは共有メモリ上に配置され、あらゆるプロセスからアクセス可能になります。
Railtiesはスキーマのバージョンもチェックしており、 schema_migrations
テーブル内にある最新レコードと現在のスキーマバージョンが一致しない場合はスキーマキャッシュを再読み込みします。これは設定のcheck_schema_cache_dump_version
オプションで管理できます。しかしこのオプションは“よくない仕様”に分類されたため、今後削除される可能性があります。
改修後
Rails 7から、スキーマキャッシュの「遅延読み込み」と「eager loading」を切り替えるオプションが使えるようになりました(#43372)。このプルリクでconfig.active_record.lazily_load_schema_cache
設定オプションが導入され、これをtrue
に設定するとスキーマキャッシュの遅延読み込みが有効になります(デフォルトはfalse
です)。
このオプションをtrue
に設定すると、起動時にRailstiesのこの機能がスキップされ、ActiveRecord::Base.connection
にアクセスしたときにのみスキーマキャッシュが読み込まれます。デフォルトのキャッシュファイルはdb/schema_cache.yml
に置かれ、これはschema_cache_path
オプションで設定できます。
なお、キャッシュのダンプは通常と同様に継続されます。この変更は、フォームキャッシュの読み込みにのみ関連します。
関連記事
Rails 7: ActiveRecord::Coreのfindがfind_byキャッシュキーを再利用するようになった(翻訳)
The post Rails 7: スキーマキャッシュが遅延読み込み可能になった(翻訳) first appeared on TechRacho.
概要
元サイトの許諾を得て翻訳・公開いたします。
なお、本記事の機能はGitHub内のカスタムアダプタでも使われているそうです(#43372)。