سؤال

لقد واجهت مؤخرا مؤشرا في قاعدة بيانات أقوم به من النموذج:

CREATE INDEX [IX_Foo] ON [Foo]
( Id ASC )
INCLUDE 
( SubId )

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

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

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

الشيء الوحيد الذي يمكنني التفكير فيه هو أنه إذا كانت هناك تحديثات على subid، فلن يحتاج الصف إلى نقله إذا تم تضمين العمود (على الرغم من أن القيمة في الفهرس ستحتاج إلى تغييرها). هل هناك شيء آخر أفتقده؟

أنا أفكر في ممارسة الفهارس الأخرى في قاعدة البيانات وتحول الأعمدة المدرجة في الفهرس الصحيح حيثما أمكن ذلك. هل سيكون هذا خطأ؟

أنا مهتم في المقام الأول بخادم MS SQL، ولكن معلومات عن محركات DB الأخرى موضع ترحيب أيضا.

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

المحلول

الإجابات حتى الآن كلها صحيحة وكلها - لكنها قد لا تنقل ما تكسب ما تكسبه من مؤشر تغطية.

في حالتك، لديك طاولة Foo وبعض المجالات، بما في ذلك Id (الذي افترض هو المفتاح الأساسي) و SubId وهو بعض معرف إضافي من نوع ما.

لديك أيضا فهرس IX_Foo الذي افترض أنه كان لديه فقط Id في ذلك الآن.

حتى الآن تحتاج إلى العثور على SubId بالنسبة Id=4.

SELECT Id, SubId
FROM Foo
WHERE Id=4
  • سينظر SQL Server إلى عبارة SELECT وتحديده يمكن استخدامه IX_Foo
  • ثم سوف يذهب البحث عن القيمة Id=4 في الفهرس الخاص بك IX_Foo
  • عندما يجدها، فإنه يحتاج الآن إلى قيمة SubId, ، جدا
  • الفهرس غير المتراكب IX_Foo سوف تحتوي على قيمة مفتاح التجميع
  • باستخدام قيمة مفتاح التجميع هذه، سيقوم SQL Server بإجراء "بحث مرجعية" لتحديد موقع صفحة البيانات الفعلية حيث يوجد صف البيانات بأكمله
  • سيجلب تلك الصفحة واستخراج القيمة SubId منه
  • سيعود هذه القيم لإرضاء استفسارك

النقطة الرئيسية هنا هي: بمجرد العثور على SQL Server Id=4 في ال IX_Foo الفهرس، وسوف يحتاج ذلك بعد ذلك إلى القيام بعملية I / O أخرى، والبحث المرجعية، للذهاب جلب صف البيانات بأكملها، من أجل أن تكون قادرا على العثور على SubId القيمة.

إذا كان لديك مؤشر تغطية، على سبيل المثال IX_Foo تحتوي ايضا SubId, ، أن I / O إضافي للقيام بإلغاء البحث المرجعية. مرة واحدة القيمة Id=4 وجدت في IX_Foo فهرس، ستضم صفحة الفهرس في فهرسك غير المتراكب أيضا قيمة SubId - يمكن الآن إرجاع SQL Server هذين القيمتين الذي طلبته في استعلام Select بدون عدم القيام بإجراء بحث إضافي (محتمل باهظ الثمن وبالتالي بطيء) إشارة مرجعية فقط للذهاب جلب عمود معرف آخر.

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

تحديث: المفاضلة هي هذا: إذا كان لديك فهرس على (ID، SubID)، فإن جميع الصفحات في الفهرس تحتوي على كلا الأعمدة - شجرة الفهرس بأكملها من خلال.

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

هذا يعنى

  • لا يمكن ل SQL Server البحث والمقارنة على SubID (القيم ليست في شجرة الفهرس)
  • يتم استخدام مساحة أقل لأن القيم هي فقط على مستوى الورقة

نصائح أخرى

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

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

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

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