سؤال

في هذه اللحظة لدينا عدد من الجداول التي تستخدم newid() في المفتاح الأساسي.هذا يسبب كميات كبيرة من التشرذم.لذلك أود أن تغيير العمود إلى استخدام newsequentialid() بدلا من ذلك.

أتصور أن البيانات الموجودة تبقى مجزأة جدا ولكن البيانات الجديدة ستكون أقل مجزأة.وهذا يعني أن يكون علي الانتظار بعض الوقت قبل تغيير PK فهرس غير متفاوت المسافات إلى متفاوت المسافات.

سؤالي هو هل من أحد لديه خبرة في فعل هذا ؟ هل هناك أي شيء يجب إغفال أنه يجب أن يكون حذرا ؟

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

المحلول

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

أن يقال, هل فعلت أي قياس لإظهار أن تجزئة هو في الواقع تؤثر على النظام الخاص بك ؟ فقط ابحث في فهرس ورؤية 'مجزأة 75%' لا لا يعني أن وقت الوصول يتأثر.هناك العديد من العوامل التي تلعب دورها (تجمع المخزن المؤقت الصفحة العمر المتوقع معدل يقرأ مقابليكتب محلة متتابعة من عمليات التزامن العمليات الخ الخ).في حين أن التحول من المعرفات الفريدة العمومية متتابعة guid هو عادة آمنة ، قد يعرض المشاكل لا تزال.فعلى سبيل المثال يمكنك أن ترى صفحة الخلاف مزلاج على إدراج مكثفة OLTP النظام لأنه يخلق الساخنة الصفحة حيث تدرج تتراكم.

نصائح أخرى

قد تفكر في استخدام مشط guids., ، بدلا من الجدد.

cast(
    cast(NewID() as binary(10)) +
    cast(GetDate() as binary(6))
as uniqueidentifier)

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

شكرا لك، yfeldblum! شرحك البسيط والموجز للموشط ساعدني حقا. كنت في الواقع أنظر في القيام بعكس هذا المنشور: اضطررت إلى الابتعاد عن الاعتماد على newsequentialid() منذ أن كنت أحاول ترحيل SQL Server 2012 DB إلى Azure و newsequentialid() وظيفة غير مدعومة هناك.

كنت قادرا على تغيير كل ما عندي من جدول PK الافتراضي لتمشيط GUIDs، مع بناء الجملة التالي:

ALTER TABLE [dbo].[Company] 
ADD  CONSTRAINT [DF__Company__Company_ID__72E6D332]  
    DEFAULT (CONVERT([uniqueidentifier],CONVERT([binary](10),newid(),0)+CONVERT([binary](6),getdate(),0),0)) FOR [CompanyId]
GO

بلدي SQL2012 DB يعيش الآن بسعادة في سحابة أزور.

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

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