sql-server - للملفات - كيفية عمل فهرس تلقائي في الوورد




لماذا استخدام جملة INCLUDE عند إنشاء فهرس؟ (5)

أثناء دراستي للامتحان 70-433 لاحظت أنه يمكنك إنشاء فهرس تغطية بإحدى الطريقتين التاليتين.

CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)

- أو -

CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)

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


إذا لم يكن العمود في WHERE / JOIN / GROUP BY / ORDER BY ، ولكن فقط في قائمة الأعمدة في جملة SELECT.

تضيف جملة INCLUDE البيانات عند مستوى أدنى / ورقة ، وليس في شجرة فهرس. هذا يجعل الفهرس أصغر لأنه ليس جزءًا من الشجرة

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

مقالة MSDN أخرى مع مثال على سبيل المثال


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


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

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


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


يوجد حد للحجم الإجمالي لكل الأعمدة الموضحة في تعريف الفهرس. ومع ذلك ، لم أضطر أبدًا لإنشاء فهرس بهذا الحجم. بالنسبة لي ، فإن الميزة الأكبر هي حقيقة أنه يمكنك تغطية المزيد من الاستفسارات مع فهرس واحد يحتوي على أعمدة حيث لا يجب تحديدها بأي ترتيب معين. فكر كمؤشر ضمن الفهرس. أحد الأمثلة على ذلك هو StoreID (حيث تكون StoreID منخفضة الانتقائية بمعنى أن كل مخزن مرتبط بالكثير من العملاء) ثم بيانات الديموغرافيات الخاصة بالعميل (LastName ، FirstName ، DOB): إذا كنت تقوم بتضمين تلك الأعمدة بهذا الترتيب (StoreID ، LastName ، FirstName ، DOB) ، يمكنك فقط البحث عن العملاء بكفاءة لمعرفة معرفتك StoreID و LastName.

من ناحية أخرى ، فإن تعريف الفهرس على StoreID ، بما في ذلك LastName ، FirstName ، DOB الأعمدة سوف يسمح لك في جوهرها أن يبحث عن رقمين قياسيين على StoreID ثم البحث عن المسند على أي من الأعمدة المضمنة. سيسمح لك ذلك بتغطية جميع عمليات البحث الممكنة طالما أنها تبدأ بـ StoreID.





indexing