1

複数のテーブルからすべての情報を 1 つに蓄積する rake タスクがあります。各テーブルは約 200,000 行です。

task :migrate_all_info_tables_to_one => :environment do
    profiles = Profile.all
    profiles.each do |profile|
      basic_info_items = profile.basic_info_items
      basic_info_items.each do |item|
        info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'info', :value => item.parameter, :link => item.link != 'none' ? item.link : nil, :description => item.value)
        profile.info_items << info
      end

      cities = profile.cities
      cities.each do |city|
        city = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'city', :value => city.title, :link => city.link != 'none' ? city.link : nil, :description => city.description)
        profile.info_items << city
      end

      histories = profile.histories
      histories.each do |item|
        info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'history', :value => item.year, :link => item.link != 'none' ? item.link : nil, :description => item.event)
        profile.info_items << info
      end

      contacts = profile.contacts
      contacts.each do |item|
        info = InfoItem.find_or_initialize_by_kind_and_value_and_link_and_description(:kind => 'contact', :value => item.parameter, :link => item.link != 'none' ? item.link : nil, :description => item.value)
        profile.info_items << info
      end
    end
  end

必要なすべてのインデックスをテーブルに追加しました (mysql 5.1.6 を使用)。mysql からの各個別のクエリは、ruby コンソールからも 0.00 秒かかります。しかし、この rake タスクを実行すると、1 分間に 100 個のプロファイル レコードしか処理されません。

PS: プロジェクトのデータベース アーキテクチャを間違えたので、これを行います。

4

2 に答える 2

2

より効率的にするには、スクリプトで使用するプロファイル関係を熱心にロードできます。次を使用します。

Profile.includes(:basic_info_items, :cities, :histories, :contacts).all

の代わりにProfile.all

すべてのプロファイルをメモリにロードするのを避けるためProfile.find_eachに、代わりにを使用することもできます。Profile.all

于 2012-11-15T18:18:50.100 に答える
1

Profile に関連するレコードがあり、すべてのプロファイルをループするときにそれらにアクセスしている場合、ActiveRecord は BEGIN と COMMIT を使用して、各プロファイルに対して個別の選択を行っている可能性があります。各選択が非常に高速であっても、これにより速度が低下します。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

積極的な読み込み関連付けに関するセクションをご覧ください。

于 2012-11-15T18:14:51.143 に答える