سؤال

أنا على دراية جيدة إلى حد ما في أداء خادم SQL، لكنني يجب أن أتجادل إلى أسفل فكرة أن GUID يجب استخدامها كنوع افتراضي لمفاتيح ClusterD الأساسية.

على افتراض أن الجدول يحتوي على كمية منخفضة إلى حد ما من إدراجات في اليوم (5000 +/- اليوم)، أي نوع من مشاكل الأداء التي يمكن أن نفري بها؟ كيف ستؤثر تقسيم الصفحات على أداء البحث لدينا؟ كم مرة يجب أن أرفع (أو يجب أن أزعج)؟ ماذا يجب أن أضع عوامل التعبئة (100، 90، 80، إلخ)؟

ماذا لو كنت أدرج 1،000،000 صف في اليوم؟

أعتذر beforhand لجميع الأسئلة، لكنني أتطلع إلى الحصول على بعض النسخ الاحتياطية لعدم استخدام GUIDs كما الافتراضي ل PKS. ومع ذلك، فأنا منفتح تماما أن تغير رأيي عن طريق المعرفة الإفراطية من قاعدة مستخدم Stackoverflow.

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

المحلول

إذا كنت تفعل أي نوع من الحجم، فإن GUID سيئة للغاية مثل PK سيئة إلا إذا كنت تستخدم guidss, لأسباب بدقة تصفك. تجزئة الصفحة شديدة:

                 Average                    Average
                 Fragmentation  Fragment    Fragment   Page     Average 
Type             in Percent     Count       Size       Count    Space Used

id               4.35           7           16.43      115      99.89
newidguid        98.77          162         1          162      70.90 
newsequentualid  4.35           7           16.43      115      99.89

و كما هذه المقارنة بين GUID والأعداد الصحيحة تظهر:

تسبب Test1 قدرا هائلا من تقسيم الصفحات، وكان لديه كثافة المسح 12% عندما ركضت DBCC ShowContig بعد إخراج الإدراج. كان جدول Test2 كثافة المسح حوالي 98٪

إذا كان حجمك منخفضا جدا، إلا أنه لا يهم كثيرا.

إذا كنت بحاجة حقا إلى معرف فريد من نوعه، ولكن لديك حجم كبير (ولا يمكن استخدام المعرفات التسلسلية)، فما عليك سوى وضع GUIDs في عمود مفهرس.

نصائح أخرى

عيوب باستخدام GUID كمفتاح أساسي:

  • لا يوجد طلب هادف، يعني الفهرسة لا يعطي دفعة الأداء كما يفعل مع عدد صحيح.
  • حجم GUID 16 بايت، مقابل 2 أو 4 أو 8 بايت لعدد صحيح.
  • من الصعب جدا أن يتذكر البشر، لذلك ليس جيدا كمعرف مرجعي.

مزايا:

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

اعتقدت أن القرار ما إذا كان يجب استخدام GUID كان بسيطا جدا، ولكن ربما أكون غير مدركين للقضايا الأخرى.

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

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

أجد الأسئلة التالية مفيدة لتضييق نطاق تحديد ما إذا كان يجب استخدام GUID أم لا.

  • هل سيتم تقاسم / نشر PK؟ (أي سوف يتم استخدامه وراء استخدامه الداخلي داخل SQL، هل ستحتاج التطبيقات إلى هذه المفاتيح بطريقة مستمرة إلى حد ما؟ هل سترى المستخدمون بطريقة أو بأخرى هذه المفاتيح؟
  • هل يمكن استخدام PK للمساعدة في دمج مصادر البيانات المتباينة؟
  • هل يحتوي الجدول على مركب بشكل أساسي مصنوع من أعمدة (أعمدة) في البيانات؟ ما هو حجم هذا ممكن هذا المفتاح
  • كيف يتم فرز المفاتيح الأساسية؟ إذا كان مركب، فهل أول أعمدة قليلة انتقائية؟

باستخدام GUID (ما لم يكن GUID متتسلسل) كوسيط متفاوت المسافات سوف يقتل أداء إدراج. نظرا لأن تخطيط الطاولة الفيزيائية محاذاة وفقا للفهرس المتجمع، باستخدام نظام GUID الذي يحتوي على طلب تسلسل عشوائي سيؤدي إلى تجزئة جدول خطيرة. إذا كنت ترغب في استخدام GUID كوسيط PK / متفاوت المسافات، فيجب أن يكون GUID متسلسل باستخدام الدالة NewSetialid () في SQL Server. هذا سيضمن أن GUIDs المولدة أمرت بالتتابع ومنع التجزئة.

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