it-swarm.asia

هل تستهلك الأعمدة الفارغة مساحة في الجدول؟

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

أفترض أن إنشاء جدول منفصل لهذا العمود سيكون أفضل.

ملاحظة: هذا هو خادم SQL 2008

enter image description here

21
aron

للحصول على أداء أكثر قابلية للتنبؤ (ولتجنب وجود اختلاف كبير في الصفوف لكل صفحة) ، أميل إلى تخزين هذه البيانات في جدول ذي صلة - خاصة إذا كان يتم ملؤها فقط بنسبة صغيرة من الوقت ، وخاصة إذا تم استردادها فقط في بعض الاستفسارات. الصفوف التي تكون فيها هذه القيمة NULL تساهم في زيادة المساحة ، ولكن هذا الحد الأدنى. الأهم من ذلك هو كيف يمكن أن تتسع صفحة واحدة فقط لصفين ويمكن أن تتسع الصفحة التالية لـ 500 صف - وهذا يمكن أن يؤثر حقًا على الإحصائيات وقد يكون من الأفضل لك تقسيم هذا لذا يتم تخزينه بشكل منفصل ولا يؤثر على جميع عملياتك على الجدول الأساسي.

9
Aaron Bertrand

يأخذ مساحة صغيرة عند عدم استخدامه

  • بت واحد في الصورة النقطية NULL
  • بايتان للطول (الذي سيكون صفر عند NULL)

النفقات العامة ضئيلة وسيكون التحسين سابق لأوانه.

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

انظر https://stackoverflow.com/questions/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265 # 3793265 للمزيد

12
gbn

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

  • تحتوي صفحة البيانات على حوالي 8000 بايت
  • لديك بعض الصفوف التي تحتوي على 100 بايت على سبيل المثال وبعض الصفوف التي تزيد عن 4000 بايت
  • ستكون هذه الصفوف الطويلة على صفحة بمفردها ، وبقية الصفحة عبارة عن مساحة "مهدرة" تستهلكها قاعدة بياناتك ولكن من المحتمل ألا تحتفظ بالبيانات أبدًا
  • إذا قمت بإضافة بيانات إلى هذا الحقل الطويل لسجل على صفحة ممتلئة في الغالب ، فمن المحتمل أن يتجاوز الصفحة ويؤدي إلى مؤشر إلى الصفحة مع بقية السجل

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

11
JNK

يبدو هذا السؤال مشابهًا جدًا: هل تؤثر الأعمدة الفارغة الزائدة على حجم جدول sql بشكل ملحوظ؟

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

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

4
hbtest

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

بالنسبة لوضعه في طاولة أخرى ، لن أزعجني. يمكنك أيضًا النظر في استخدام varchar (max) وخيارات الدخول/الخروج من الصف. مرة أخرى ، ربما سابق لأوانه.

2
Cade Roux