it-swarm.asia

إضافة أعمدة إلى جداول الإنتاج

ما هي أفضل طريقة لإضافة أعمدة إلى جداول الإنتاج الكبيرة في SQL Server 2008 R2؟ وفقًا لكتب Microsoft عبر الإنترنت:

يتم تنفيذ التغييرات المحددة في ALTER TABLE على الفور. إذا كانت التغييرات تتطلب تعديلات على الصفوف في الجدول ، فإن ALTER TABLE يقوم بتحديث الصفوف. يحصل ALTER TABLE على قفل تعديل المخطط على الجدول للتأكد من عدم وجود اتصالات أخرى تشير حتى البيانات الوصفية للجدول أثناء التغيير ، باستثناء عمليات الفهرس عبر الإنترنت التي تتطلب قفل SCH-M قصير جدًا في النهاية.

(http://msdn.Microsoft.com/en-us/library/ms190273.aspx)

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

29
sh-beta

"هذا يعتمد"

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

على سبيل المثال ، تتطلب إضافة int أو char حركات الصف الفعلية. لا يجب إضافة فارغ فارغ بدون افتراضي (إلا إذا كانت الصورة النقطية NULL تحتاج إلى التوسع)

تحتاج إلى تجربته على نسخة مستعادة من الإنتاج للحصول على تقدير

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

لقد قمت بتغيير مليار من جداول الصفوف التي استغرقت بضع ثوانٍ لإضافة عمود فارغ.

هل قلت أن تأخذ نسخة احتياطية أولاً؟

27
gbn

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

  • إضافة العمود كـ NULLable - يجب أن يكون سريعًا في معظم الحالات
  • تحديث القيم الافتراضية
    • يمكنك القيام بذلك على دفعات إذا لزم الأمر
    • يمكنك أيضًا استخدام هذا لتطبيق المنطق الشرطي حيث قد لا تحصل بعض الصفوف على الافتراضي
  • إضافة القيود غير الصفرية/الافتراضية
    • سيكون هذا أسرع عندما لا تكون أي من البيانات فارغة ، ولكن يجب أن تكون قابلة للقياس

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

21
Aaron Bertrand

هل فكرت:

  1. إنشاء جدول جديد يتضمن التغييرات في تعريف الجدول.
  2. الإدراج في تعريف الجدول الجديد بالاختيار من الجدول الأصلي.
  3. إعادة تسمية الجدول الأصلي إلى _orig ثم إعادة تسمية الجدول الجديد إلى اسم الجدول الأصلي.

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

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

4
RobPaller

لدي استثناء خاص أشعر أنه يجب ذكره.

باستخدام SQL Server 2012 Enterprise والإصدارات الأحدث ، تعد إضافة عمود NOT NULL جديد مع ثابت وقت التشغيل عملية عبر الإنترنت تكتمل على الفور ولا تعتمد على عدد الصفوف في الجدول.

تم العثور على مزيد من المعلومات حول هذا في MSDN

سأعيد إنتاج القسم المهم

بدءًا من SQL Server 2012 (11.x) Enterprise Edition ، فإن إضافة عمود NOT NULL بقيمة افتراضية هي عملية عبر الإنترنت عندما تكون القيمة الافتراضية هي ثابت وقت التشغيل. هذا يعني أن العملية اكتملت على الفور تقريبًا على الرغم من عدد الصفوف في الجدول. لأنه لا يتم تحديث الصفوف الموجودة في الجدول أثناء العملية. بدلاً من ذلك ، يتم تخزين القيمة الافتراضية فقط في البيانات الوصفية للجدول ويتم البحث عن القيمة ، حسب الحاجة ، في الاستعلامات التي تصل إلى هذه الصفوف.

1
rince