سؤال

أنا أعمل تحت إعادة إنشاء مخطط قاعدة البيانات (SQL Server 2008) وجمع الحجج للتغيير NCHAR(1) الأعمدة (التي تبقي Y|N القيم) إلى BIT. يدرك الجميع أن هذا ضروري ولا يعرف لماذا يحدث ، لكن هذا التغيير يؤثر على قاعدة بيانات الإنتاج ، لذا فإن الحجج الثقيلة مطلوبة. يحافظ الجدول على كتالوج العنوان (ما يصل إلى 1 متر من السجلات).

الحجة الأولى التي وجدتها - كل منها حقول NCHAR خذ 2 بايت ، كل 8 حقول بت - 1 بايت (8 التالي - بايت واحد إضافي).

ماذا بعد؟ ربما بعض مشكلات أداء الفهارس؟

هل كانت مفيدة؟

المحلول

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

أنظر أيضا:

نصائح أخرى

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

هل راجعت ما إذا كان استخدام NCHAR (1) يضر بالأداء ، أم أنك تقع في فخ التحسين السابق لأوانه؟ أنت تتحدث فقط عن مليون سجل هنا.

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

أحد الأسباب الشائعة للعثور على NCHAR (1) بدلاً من أن تكون Oracle لم تدعم نوعًا قليلاً. إذا كان لديك مطور Oracle أو Oracle المدربين ، أو قاعدة بيانات تستخدم لتشغيل Oracle ، فسترى هذا كثيرًا. في SQL Server ، ليست هناك حاجة لذلك.

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

قم بإنشاء حقل بت ، أضف عمودًا محسوبًا يحاكي NCHAR (1) في الوقت الحالي.

ما لا لاستخدام NCHAR:

  • Y ضد y مقابل بعض unicode Y
  • فوق التحقق من y أو n
  • ليس أصلاً "صحيحًا" O "False" (على سبيل المثال ، لن يتم تعيينه مباشرة إلى .NET Boolean)
  • Y و N هي الإنجليزية. JA/NEIN ، OUI/غير الخ

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

  • الأصغر
  • نوع البيانات آمن (على سبيل المثال لا حاجة للتحقق)
  • خرائط للعميل معنى مباشرة
  • مستقلة عن المنطقة

قولًا ذلك ، نستخدم مجالًا صغيرًا "عندما يكون" كبديل عن مجال "Isactive". فارغ = نشط.

إذا كنت تستخدم LINQ2SQL أو إطار الكيان أ BIT سوف يترجم العمود إلى أ bool, ، لكن NCHAR(1) سوف يترجم إلى أ string.

هو الحقل المستخدم على نطاق واسع في الاستفسارات Where fld = 'Y'?

إذا كان الأمر كذلك ، فسأفكر في إجراء اختبار لمعرفة ما إذا كان تغييره إلى أداء البتات.

تغييره الآن لمجرد أنه يجب أن يكون حقلًا قليلاً نظرًا لأنك تخزن قيم Boolean على جدول 1M+ سجلات لا يبدو لي فكرة جيدة بالنسبة لي أيضًا وسأذهب مع إجابة @Andrew.

استخدم بت:

  • التمثيل المنطقي / التعبير عن النية - لأن الدول المنطقية لا يمكن التعبير عنها دائمًا باستمرار Yes or No, ، مما يعني بعد ذلك أنك ستحتاج إلى أن تكون غير متسقة في نمذجة البتات ، أو غير بديهية ، على سبيل المثال True/False (T/F), On/Off (?O/F), Open/Closed(O/C) إلخ.

  • النزاهة المرجعية - يمكن أن تقتصر بت غير قابل للفرق فقط على 0 or 1. ما لم تضيف قيودًا ، *char(1) ممكن ان يكون Y,N, X أو .

  • يمكن تعبئة البتات, ، لذلك يمكن أن يكون تخزين أصغر.

  • رد: الأداء: فهرسة أعمدة بت (أو قليلة الحالة) تكون عادةً مضيعة ، ما لم تكن هناك انتقائية عالية إما 0 أو 1 في البيانات. في هذه الحالة ، أ فهرس مرشح على القيمة الانتقائية ستكون فكرة جيدة.

(هاجر من الإجابة المحذوفة هنا)

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

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