القضبان: أشعل النار db: الترحيل * بطيئة جدا على أوراكل
-
09-09-2019 - |
سؤال
أنا أستخدم القضبان مع 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 ثانية لتنفيذها.
لإصلاح السرعة، فعلت ثلاثة أشياء:
- انخفض جميع الطاولات غير المطابقة (حوالي 250 من 500)
- جداول الأرشيف المستثناة من تفريغ المخطط
- التخزين المؤقت نتيجة الاستعلام المدى الطويل
قام هذا بتحسين الوقت من تفريغ الترحيل / المخطط للحصول على جداول 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