تغطية الفهارس عندما يتم تحديد أعمدة إضافية بشكل فريد بواسطة فهرس متفاوت المسافات

StackOverflow https://stackoverflow.com/questions/1927399

سؤال

لنفترض أنني بحاجة إلى تحديث myTab من luTab على النحو التالي

update myTab
  set LookupVale = (select LookupValue from luTab B
                                       where B.idLookup = myTab.idLookup)

يتكون luTab من عمودين (idLookup(unique)، LookupValue)

وهو الأفضل :فهرس مجمع فريد من نوعه على idLookup، أو واحد على idLookup وLookupvalue مجتمعين؟هل سيحدث مؤشر التغطية أي فرق في هذه الحالة؟

(أنا مهتم في الغالب بخادم SQL)


الخاتمة :

لقد تابعت اختبارات Krips أدناه مع 27 مليون صف في myTab، و1.5 مليون صف في luTab.يبدو أن الجزء الحاسم هو تفرد المؤشر.إذا تم تحديد الفهرس على أنه فريد، فسيستخدم التحديث جدول التجزئة.إذا لم يتم تحديده على أنه فريد، فسيقوم التحديث أولاً بتجميع luTab بواسطة idLookup (Stream Aggegate) ثم يستخدم حلقة متداخلة.وهذا أبطأ بكثير.عندما أستخدم الفهرس الموسع، لم يعد SQL يُفترض الآن أن قيمة LookupValue فريدة من نوعها، لذا يتم فرضها على مسار الحلقة المتداخلة المجمعة الأبطأ بكثير

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

المحلول

ولقد خلقت الجداول الخاصة بك وتحميلها فقط عدد قليل من سجلات (50 أو نحو ذلك البحث، و 15 في myTab).

وبعد ذلك لقد حاول خيارات مؤشر مختلفة. مؤشر بحث على luTab دائما بتكلفة قدرها 29٪.

وبت المثير للاهتمام هو أنه إذا قمت بإضافة في العمود LookupValue للمؤشر على luTab يظهر خطة تنفيذ خطوتين إضافية بعد مؤشر تسعى: تيار الحصى وتأكيد. بينما تكلفة 0٪، والتي قد ترتفع مع المزيد من البيانات.

ولقد حاول أيضا فهرس nonclustered على مجرد idLookup، وبما في ذلك LookupValue ك "عمود شملت". بهذه الطريقة صفحات البيانات لا بد من الوصول إلى استرداد أن هذا العمود. وهذا قد يكون خيارا بالنسبة لك على الرغم من أن خطة التنفيذ لا تظهر أي شيء مختلف (ولكن ليس لديهم تيار الحصى / تأكيد سواء).

و-Krip

نصائح أخرى

أولاً:

  • فهرس التغطية يكون دائمًا غير متجمع
  • يجب أن يكون لديك دائمًا PK وفهرس متفاوت المسافات (يوجد نفس الشيء افتراضيًا على SQL Server)

المفهومان منفصلان

لذا:

  • سيكون PK (المجمع) الخاص بك هو idLookup إذا كان هذا يحدد صفًا بشكل فريد
  • سيكون فهرس التغطية هو (idLookup) INCLUDE (LookupValue)

لكن:

  • idLookup هو PK (مجمع)، لذا لا تحتاج إلى فهرس تغطية
  • الفهرس المجمع (PK) "يغطي" ضمنيًا طبيعة الفهرس المجمع (ببساطة، الفهرس عبارة عن بيانات في أدنى مستوى)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top