Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails 7: スキーマキャッシュが遅延読み込み可能になった(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

なお、本記事の機能はGitHub内のカスタムアダプタでも使われているそうです(#43372)。

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キャッシュキーを再利用するようになった(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。