القضبان: أشعل النار db: الترحيل * بطيئة جدا على أوراكل

StackOverflow https://stackoverflow.com/questions/592444

سؤال

أنا أستخدم القضبان مع oracleenhanced محول لإنشاء واجهة جديدة للتطبيق القديم.

تعمل عمليات تصريحات قاعدة البيانات بنجاح، ولكنها تأخذ فترة طويلة بشكل لا يصدق من الوقت قبل التشطيبات أشعل النار. تحدث تغييرات قاعدة البيانات بسرعة كبيرة (1 أو ثانيت)، ولكن db/schema.db تفريغ يستغرق أكثر من ساعة لإكمالها. (انظر المثال الترحيل أدناه.)

إنه مخطط كبير نسبيا (حوالي 150 طاولة)، لكنني متأكد من أنه لا ينبغي أن يأخذ هذا الوقت الطويل لتفريغ كل وصف الجدول.

هل هناك على أي حال لتسريع هذا من خلال التقاط آخر schema.db وتطبيق التغيير المحدد في الترحيل إليه؟ أو أنا قادر على تخطي هذا المخطط تفريغ تماما؟

أنا أفهم هذا schema.db يستخدم لإنشاء قاعدة بيانات الاختبار من نقطة الصفر في كل مرة، ولكن هذه الحالة، هناك جزء كبير من منطق قاعدة البيانات في الجدول المشغلات التي ليست مدرجة في schema.rb على أي حال، لذلك اختبارات أشعل النار ليست جيدة بالنسبة لنا في أي حال. (هذه مشكلة مختلفة تماما أحتاج إلى فرزها في مرحلة أخرى.)

DGS @ DGS-LAPTOP: ~ / القضبان / فوياجر $ وقت أشعل النار DB: الترحيل (في / الصفحة الرئيسية / DGS / القضبان / فوياجر) == 20090227012452 AddModuleActionandControllernerollernames: الترحيل ===================================================================================== - add_column (: moduls ،: action_name،: نص) -> 0.9619S -> 0 صفوف - add_column (: modules، add_column (: controller_name،: نص) -> 0.1680s -> 0 صفوف == 20090227012452 S) ======= Real 87M12.961S المستخدم 0M12.949S SYS 0M2.128S
هل كانت مفيدة؟

المحلول

بعد تطبيق جميع الهوجريات على قاعدة البيانات ثم أشعل النار DB: ترحيل المكالمات DB: مخطط: تفريغ مهمة إنشاء ملف Schema.rb من مخطط قاعدة البيانات الحالي.

DB: مخطط: تفريغ طريقة "جداول" محول "محول" للحصول على قائمة جميع الجداول، إذن لكل جدول "فهرسة" طريقة "الفهارس" وطريقة "الأعمدة". يمكنك العثور على عبارات SQL SELECT المستخدمة في هذه الطرق في ملف oracle_enhanced_adapter.rb. في الأساس، يختار من جميع الجداول٪ أو مستخدمي Data Data Docal Docal٪ للعثور على جميع المعلومات.

في البداية كان لدي مشكلات مع محول Oracle الأصلي عندما استخدمته مع قواعد البيانات مع الكثير من المخططات المختلفة (حيث قد يتأثر الأداء إجمالي عدد الجدول في قاعدة البيانات - ليس فقط في مخططك) وبالتالي فعلت بعض التحسينات في Oracle Hevanced مشترك كهربائي. سيكون من الجيد معرفة الطرق التي تبطئ في قضيتك (أظن أنه قد يكون إما "فهارس" أو طريقة "أعمدة" يتم تنفيذها لكل جدول).

طريقة واحدة مجرفة لتصحيح هذه المشكلة ستكون إذا كنت ستضع بعض رسائل التصحيح في ملف Oracle_enhanced_Adapter.rb بحيث يمكنك تحديد ما هي المكالمات الطريقة التي تستغرق وقتا طويلا.

نصائح أخرى

المشكلة في الغالب حلها بعد بعض الحفر في oracle_enhanced_adapter.rb.

توقفت المشكلة إلى الطريق الكثير من الجداول في المخطط المحلي (كثير EBA_%, EVT_%, EMP_%, SMP_% تم إنشاء جداول موجودة في مرحلة ما في مرحلة ما من العمر)، وجداول الأرشيف التي يتم تضمينها في تفريغها وحدد من قواميس البيانات التي تأخذ 14 ثانية لتنفيذها.

لإصلاح السرعة، فعلت ثلاثة أشياء:

  1. انخفض جميع الطاولات غير المطابقة (حوالي 250 من 500)
  2. جداول الأرشيف المستثناة من تفريغ المخطط
  3. التخزين المؤقت نتيجة الاستعلام المدى الطويل

قام هذا بتحسين الوقت من تفريغ الترحيل / المخطط للحصول على جداول 350 المتبقية من حوالي 90 دقيقة إلى حوالي 15 ثانية. أكثر من سريع بما فيه الكفاية.

الرمز الخاص بي على النحو التالي (للإلهام الذي لا نسخ ولصقه - هذا الرمز محدد إلى حد ما لقاعدة البيانات الخاصة بي، ولكن يجب أن تكون قادرا على الحصول على الفكرة). تحتاج إلى إنشاء جدول TEMP يدويا. يستغرق الأمر حوالي 2 أو 3 دقائق بالنسبة لي القيام به - لا يزال طويلا لتوليد مع كل هجرة، وهو ثابت إلى حد ما على أي حال =)

module ActiveRecord
  module ConnectionAdapters
    class OracleEnhancedAdapter
      def tables(name = nil)
        select_all("select lower(table_name) from all_tables where owner = sys_context('userenv','session_user')  and table_name not like 'A!_%' escape '!' ").inject([]) do | tabs, t |
          tabs << t.to_a.first.last
        end
      end


      # TODO think of some way to automatically create the rails_temp_index table 
      #
      #   Table created by: 
      #   create table rails_temp_index_table as 
      #   SELECT lower(i.index_name) as index_name, i.uniqueness, 
      #          lower(c.column_name) as column_name, i.table_name
      #    FROM all_indexes i, user_ind_columns c
      #    WHERE  c.index_name = i.index_name 
      #       AND i.owner = sys_context('userenv','session_user')
      #       AND NOT exists  (SELECT uc.index_name FROM user_constraints uc 
      #              WHERE uc.constraint_type = 'P' and uc.index_name = i.index_name);

        def indexes(table_name, name = nil) #:nodoc:

              result = select_all(<<-SQL, name)
                SELECT index_name, uniqueness, column_name
                  FROM rails_temp_index_table
                 WHERE table_name = '#{table_name.to_s.upcase}'
                  ORDER BY index_name
              SQL

              current_index = nil
              indexes = []

            result.each do |row|
                if current_index != row['index_name']
                  indexes << IndexDefinition.new(table_name, row['index_name'], row['uniqueness'] == "UNIQUE", [])
                  current_index = row['index_name']
                end

                indexes.last.columns << row['column_name']
              end

              indexes
            end
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top