4

アダプターでレールを使用しoracleenhancedて、レガシーアプリケーション用の新しいインターフェイスを作成しています。

データベースの移行は正常に機能しますが、レーキが終了するまでに非常に長い時間がかかります。データベースの変更は非常に迅速に(1秒または2秒)行われますが、db/schema.dbダンプが完了するまでに1時間以上かかります。(以下の移行例を参照してください。)

これは比較的大きなスキーマ(約150テーブル)ですが、各テーブルの説明をダンプするのにこれほど長くかかることはないと確信しています。

schema.db最後のものを取得し、移行で指定された変更をそれに適用するだけで、これを高速化する方法はありますか?または、このスキーマダンプを完全にスキップできますか?

schema.dbこれは毎回テストデータベースを最初から作成するために使用されることを理解していますが、この場合、schema.rbとにかく含まれていないテーブルトリガーにデータベースロジックの大きなチャンクがあるため、レーキテストはどのような場合にも適していません場合。(これはまったく別の問題であり、別の時点で解決する必要があります。)

dgs @ dgs-laptop:〜/ rails / voyager $ time rake db:migrate
(/ home / dgs / rails / voyager内)
== 20090227012452 AddModuleActionAndControllerNames:移行================
--add_column(:modules、:action_name、:text)
   -> 0.9619s
   ->0行
--add_column(:modules、:controller_name、:text)
   -> 0.1680s
   ->0行
== 20090227012452 AddModuleActionAndControllerNames:移行済み(1.1304s)=======


本物の87分12秒961
ユーザー0m12.949s
sys 0m2.128s
4

2 に答える 2

4

すべての移行がデータベースに適用された後、rake db:migrateはdb:schema:dumpタスクを呼び出して、現在のデータベーススキーマからschema.rbファイルを生成します。

db:schema:dumpは、アダプタの「tables」メソッドを呼び出してすべてのテーブルのリストを取得し、テーブルごとに「indexes」メソッドと「columns」メソッドを呼び出します。これらのメソッドで使用されるSQLSELECTステートメントは、activerecord-oracle_enhanced-adaptergemのoracle_enhanced_adapter.rbファイルにあります。基本的に、ALL%またはUSER%のデータディクショナリテーブルから選択して、すべての情報を検索します。

当初、元のOracleアダプターをさまざまなスキーマのデータベースで使用すると問題が発生しました(スキーマだけでなく、データベース内のテーブルの総数によってパフォーマンスが影響を受ける可能性があるため)。したがって、Oracle拡張でいくつかの最適化を行いました。アダプタ。あなたのケースでどのメソッドが遅いかを見つけるのは良いことです(テーブルごとに実行されるのは「インデックス」または「列」メソッドのいずれかである可能性があります)。

この問題をデバッグする1つの方法は、いくつかのデバッグメッセージをoracle_enhanced_adapter.rbファイルに入れて、どのメソッド呼び出しに非常に時間がかかっているかを特定できるようにすることです。

于 2009-02-27T21:08:55.627 に答える