سؤال

حتى الآن كنت أستخدم GUID = GUID = GUID.NEWGUID ()؛ " الطريقة لتوليد معرف فريد يمكن تخزينه كحقل معرف في بعض جداول قاعدة بيانات SQL Server الخاصة بي باستخدام LinQ إلى SQL. لقد أبلغت أنه لأسباب فهرسة، فإن استخدام GUID هو فكرة سيئة وأنه يجب علي استخدام زيادة تلقائية طويلة بدلا من ذلك. سوف تستخدم تسريع تسريع معاملات قاعدة البيانات الخاصة بي؟ إذا كان الأمر كذلك، كيف أذهب حول توليد معرف فريد من النوع الطويل؟

يعتبر،

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

المحلول

كلاهما لديه إيجابيات وسلبيات، فإنه يعتمد كليا على كيفية استخدامها لهم.

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

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

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

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

نصائح أخرى

هناك فترة طويلة (Big int في SQL Server) هي 8 بايت و GUID هي 16 بايت، لذلك أنت نصف عدد SQL Server يجب أن تقارن عند البحث عن بحث.

لتوليد هوية طويلة الاستخدام (1،1) عند إنشاء الحقل في قاعدة البيانات.

إما أيضا استخدام إنشاء جدول أو تغيير الجدول:

Field_NAME BIGINT NOT NULL PRIMARY KEY IDENTITY(1,1)

انظر التعليقات لنشر LinQ إلى SQL

"ملكة الفهرسة" - كيم تريب - تقول أساسا كل شيء في فهرسة مدونات المشاركات:

في الأساس، أفضل ممارساتها هي: يجب أن يكون مفتاح التجميع الأمثل:

  • فريدة من نوعها
  • صغير
  • مستقرة (لا تتغير أبدا)
  • من أي وقت مضى زيادة

تنتهك GUID "صغير" و "زيادة متزايدة"، وبالتالي فهي ليست مثالية.

بالإضافة إلى: سيتم إضافة جميع مفاتيح التجميع الخاصة بك إلى كل إدخال واحد في كل فهرس واحد غير متفاوت المسافات (كإجراء بحث للعثور بالفعل على السجل في قاعدة البيانات)، وبالتالي تريد أن تجعلها صغيرة قدر الإمكان (int = 4 بايت مقابل GUID = 16 بايت). إذا كان لديك مئات من الملايين من الصفوف والعديد من المؤشرات غير المتراكبة، فإن اختيار كثف أو كشط فوق GUID يمكن أن يحدث فرقا كبيرا - حتى الفضاء فقط.

مارك

استخدم GUIDS عندما تحتاج إلى النظر في استيراد / تصدير إلى قواعد بيانات متعددة. غالبا ما تكون GUIDS أسهل من الاستخدام من الأعمدة التي تحدد سمة الهوية عند العمل مع مجموعة بيانات من علاقات الأطفال المتعددة. هذا لأنه يمكنك إنشاء عشوائيا GUIDs في التعليمات البرمجية في حالة منفصلة من قاعدة البيانات، ثم إرسال جميع التغييرات في وقت واحد. عندما يتم إنشاء GUIDs بشكل صحيح، فهي من الصعب بشكل مؤمن أن تكرر بالصدفة. مع أعمدة الهوية، غالبا ما يتعين عليك القيام بإدراج INTITIAL من الصف الأم والاستعلام عن هوية جديدة قبل إضافة بيانات الطفل. يجب عليك بعد ذلك تحديث جميع السجلات الفرعية مع الهوية الأصل الجديدة قبل ارتكابها إلى قاعدة البيانات. الشيء نفسه ينطبق على الأحفاد وهلم جرا للرياجي. إنه يبني الكثير من العمل الذي يبدو غير ضروري ودنيوي. يمكنك أن تفعل شيئا مشابها لشركة GUID من خلال التشغيل باستخدام أعداد صحيحة عشوائية دون مواصفات الهوية، ولكن يتم زيادة فرصة الاصطدام بشكل كبير أثناء إدراج المزيد من السجلات مع مرور الوقت. (guid.newguid () يشبه عشوائيا INT128 - وهو غير موجود بعد).

أستخدم البايت (Tinyint)، Int16 (Smallint)، Int32 / UINT16 (INT)، INT64 / UINT32 (Bigint) لقوائم البحث الصغيرة التي لا تتغير أو البيانات التي لا تكرر بين قواعد بيانات متعددة. (الأذونات، تكوين التطبيق، أسماء الألوان، إلخ)

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

كما هو الحال مع أي شيء، أفضل شيء يجب القيام به هو إثبات وجهة نظرك. إنشاء قاعدة بيانات اختبار مع جدولين. واحد مع مفتاح أساسي من الأعداد الصحيحة / سوداء، والآخر مع GUID. ملء كل منها مع صفوف N-مليون. Moniter أداء كل من عمليات CRUD (إنشاء، قراءة، تحديث، حذف). قد تكتشف أنه يحتوي على ضرب أداء، ولكنه ضئيل.

غالبا ما تعمل الخوادم على صناديق دون تصحيح البيئات والتطبيقات الأخرى التي تتناول وحدة المعالجة المركزية والذاكرة و I / O من القرص الصلب (خاصة مع RAID). تعطيك بيئة تطوير فقط فكرة عن الأداء.

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

إذا استمرت مع الهوية، فتأكد من اختيار نوع البيانات الأيمن، بناء على عدد المفاتيح المتوقعة التي ستنشئها:

bigint - 8 Bytes - max positive value: 9,223,372,036,854,775,807  
int    - 4 Bytes - max positive value:             2,147,483,647

ملاحظة "عدد المفاتيح المتوقعة" مختلفة عن عدد الصفوف. إذا أضفت أساسا والحفاظ على الصفوف، فقد تجد أن Int يكفي مع أكثر من 2 مليار مفاتيح فريدة من نوعها. سأراهن على طاولتك لن تحصل على هذا الكبير. ومع ذلك، إذا كان لديك جدول كبير في الحجم حيث يمكنك الاستمرار في إضافة صفوف وإزالة الصفوف، فقد يكون عدد الصفوظ قد يكون منخفضا، لكنك ستذهب عبر مفاتيح سريعة. يجب عليك القيام ببعض العمليات الحسابية لمعرفة كيفية تسجيل الأمر الذي سيستغرقه المرور عبر مفتاح Ints 2 مليار مفاتيح. إذا لم تستخدمها في أي وقت قريبا الذهاب مع int، فقم بتضاعف حجم المفتاح والذهاب مع bigint.

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