it-swarm.asia

كيف يمكنني إضافة عمود صف إلى جدول كبير بأقل وقت للتعطل

باستخدام SQL Server 2008 والإصدارات الأحدث ، أريد إضافة عمود نسخة صف إلى جدول كبير ولكن عندما أقوم ببساطة

ALTER TABLE [Tablename]
ADD Rowversion [Rowversion] NOT NULL

ثم الجدول غير متاح للتحديثات لفترة طويلة جدًا.

ما هي الاستراتيجيات التي يمكنني استخدامها لتقليل وقت التوقف عن العمل؟ سأفكر في أي شيء. كلما كان ذلك أبسط كلما كان ذلك أفضل بالطبع ، لكني سأفكر في أي استراتيجية.

رأيي هو أنه كملاذ أخير ، يمكنني الحفاظ على نسخة من الجدول المرحلي التي تحتفظ بها المشغلات ومن ثم sp_rename جدول التدريج في الجدول الأصلي. لكنني آمل في شيء أبسط/أسهل.

21
Michael J Swart

ضع في اعتبارك إنشاء جدول جديد بنفس المخطط بالإضافة إلى عمود نسخة الصف ، وأضف طريقة عرض أعلى كلا الجدولين الذي يؤدي إلى توحيد الكل. اطلب من الأشخاص استخدام العرض والكتابة بدلاً من المشغلات مقابل الجداول وطرق العرض الأساسية.

يجب إرسال الإدخالات إلى الجدول الجديد ، ويجب أن تنقل التحديثات البيانات إلى الجدول الجديد ، ويجب تطبيق عمليات الحذف على كلا الجدولين.

ثم قم بتحركات مجمعة في الخلفية ، حيث يمكنك نقل أكبر عدد ممكن من السجلات في المرة الواحدة إلى الجدول الجديد. لا يزال بإمكانك مواجهة مشكلات التزامن أثناء حدوث ذلك ، وبعض خطط التنفيذ السرية ، ولكنها تتيح لك البقاء على الإنترنت أثناء حدوث التحركات.

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

لتجنب إطلاق المشغلات عندما يتم ترحيل البيانات على دفعات ، انظر إلى عدد الصفوف في الجداول المحذوفة/المدرجة في المشغل ، وتخط الأنشطة إذا كانت قريبة من عدد الصفوف في الدفعة.


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

26
Brent Ozar

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

تحدث الأقفال الطويلة بالتأكيد بسبب انقسام الصفحة في طبقة التخزين. لذا اجبرهم على جدولك الخاص.

  1. إضافة عمود مؤقت قادر على NULL مع نوع البيانات VARBINARY(8).
  2. ابحث عن وقت التباطؤ المتاح في قاعدة البيانات لتحديث دفعات من السجلات الموجودة بقيمة صالحة للحقل. (0x0000000027F95A5B على سبيل المثال)
  3. ستفرض التحديثات تجزئة الصفحة الضرورية وتخصيص مساحة أكبر للجدول.
  4. عند الانتهاء ، أسقط العمود المؤقت (لا يلمس التخزين المخصص) وأضف عمود نسخة الصف.
  5. لا توجد انقسامات صفحة ، وقفل مطلوب لفترة طويلة فقط بما يكفي لملء القيم.

لقد استخدمت هذا بنجاح لإضافة عمود نسخة صف إلى جدول صف 150M في أقل من 10 دقائق.

تحذير ... إذا كان لديك جدول به حقول varchar كبيرة (خاصة varchar(max)) يقرر SQL Server إعادة بناء الجدول بدلاً من إعادة استخدام المساحة المتوفرة حديثًا. لا تزال تحاول معرفة طريقة حول ذلك.

7
Scott Lynch

إذا كان TIMESTAMP الذي تضيفه هو NULLABLE:

  1. إضافة عمود VARBINARY(8)
  2. تعبئة بالبيانات.

بعد أن يتم ملؤها ، في عبارات SQL المتتالية ، DROP العمود VARBINARY(8) الذي قمت للتو بإضافته وتعبئته ، وإضافة العمود TIMESTAMP NULL.


إذا كان TIMESTAMP الذي تضيفه هو NOT NULLABLE:

  1. إضافة عمود BINARY(8)
  2. تعبئة بالبيانات.

بعد أن يتم ملؤها ، في عبارات SQL المتتالية ، DROP العمود BINARY(8) الذي قمت للتو بإضافته وتعبئته والعمود ADD THE TIMESTAMP NOT NULL.

1
user69073