2015/11/26

SQL Server Index بالعربي

SQL Server Index

مقدمة

هذا المقال جزء من سلسلة لشرح ال SQL Server Execution Plan , اذا كانت هذه اول زيارة لك لهذه السلسلة يمكنك البدء من الرابط التالي مقدمة عن خطوات تنفيذ ال Query داخل ال Sql Server ؟

في هذا المقال سوف نتناول انواع ال Indexes الهامة داخل ال SQL Server لارتباط فهمنا بطريقة عمل ال Indexes بالعمليات التي تحدث داخل ال  Execution Plan.


عملية بحث بسيطة

تخيل معي ان لديك قائمة من البيانات و ليكن بها ارقام الموظفين في الشركة التي تعمل بها و تريد ان تكتب برنامج يبحث داخل هذه القائمة عن رقم معين ويجلب لك ترتيب وجوده في القائمة.
اول طريقة يذهب عقلك اليها انك تقوم بعمل LOOP على الارقام في هذه القائمة و تقارن داخلها الرقم الذي تبحث عنه بكل رقم في القائمة الى ان تصل الى تطابق و عندها ينتهي البحث
فرضاً ان الرقم قد يكون مكرر داخل القائمة اذاً لابد اذا وجدت الرقم مطابق ان تكمل البحث الى اخر القائمة حتى تتأكد من عدم وجود رقم اخر مطابق

اذا البرنامج السابق سوف يقوم بعدد لفات Iterations بعدد البيانات المتواجدة ,
 اذاً في جدول بيانات به مليون سجل (وهذا رقم بسيط ) يكون الوضع مرعب :)

تخيل معي ان القائمة مرتبة ابجديا؟
اذا عملية البحث سوف تنتهي عندما اجد تطابق معين و بعده لا اجد تطابق اخر حينها يتم التوقف (اذاً تم تحسين الاداء في حالة الترتيب).

تخيل معي ان لديك دليل يخبرك بان الارقام من 20 الى 25 توجد هنا و الارقام من 26 الى 30 توجد هنا وهكذا ,
اذا انت لست مضطر ان تبحث داخل كل القائمة ولكنك ستبحث فقط داخل هذا الدليل
هذا بالضبط ما يقوم به ال Index داخل ال SQL Server

Index Structures

عندما تقوم بعمل Index على اي عمود او مجموعة عماويد داخل ال SQL Server يقوم ال SQL Server بتخزين بيانات خاصة بهذا ال Index لتسهيل عمليات البحث وتكون على شكل Tree تسمى B-Tree كالشكل التالي
شكل 1 - Index B-Tree
كل Node داخل هذه ال Tree تحتوي على مدى بيانات مثلا كما في المثال السابق العمر من 1 الى 100 و هكذا و بالتالي عند اي عملية بحث ستجد انك ستذهب في اتجاهات محددة دون الحاجة لفحص كل البيانات المتاحة لديك.

ولكن كما ذكرت سابقا تقسيم البيانات يتم على العمود الذي تم عمل Index عليه فماذ يحدث مثلا اذا قمت بوضع Index على رقم الموظف في الشركة و قمت بعملية بحث عن الرقم ولكن اريد ان اعرض الاسم و تاريخ التعيين والعمر للموظف صاحب هذا الرقم؟

في هذا المثال سنحتاج الى معرفة نوع ال  Index هل هو Clustered او Non-Clustered

اذا كان نوعه Clustered Index

اذاً في هذه الحالة ال Leaf Level في ال Tree يحمل كل بيانات السجل المخزنة (الاسم و تاريخ التعيين والعمر) و بالتالي سيتم جلبها مباشرة من ال Leaf Level.
ويوجد بعض المحددات لعمل Clustered Index من ضمنها ان  تكون البيانات لا تتكرر داخل عماويد ال Index وايضا لا يمكن عمل اكثر من Clustered Index داخل الجدول الواحد.

اذا كان نوعه Non-Clustered Index

اذاً في هذه الحالة ال Leaf Level في ال Tree يحمل مؤشرPointer للمكان الذي توجد به البيانات ويكون هذا المؤشر في الجداول التي تحمل Clustered Index هو ال Key الذي تم عمل ال Clustered Index عليه,
اذاً لجلب بيانات غير بيان العمود المعمول عليه ال Index سيتم عمل عملية اضافية لجلب البيانات من مكانها وهذا سيتضح معنا كثيرا في ال Execution Plan.
ومن الممكن داخل ال SQL Server جعل ال Non-Clustered Index يحمل بيانات اخرى غير بيانات العماويد المعمول عليها الIndex لتجنب هذه الخطوة الاضافية وفي هذه الحالة تسمى العماويد الاضافية ب Included Columns ولكن لا شىء بدون ثمن.
ويمكن عمل اكثر من Non-Clustered Index داخل الجدول الواحد.

التأثير على الاداء

مما سبق يتضح جلياً ان التأثير على عمليات البحث و الترتيب وعمليات جلب البيانات سيكون فعال جداً ولكن للاسف لا شيء بدون ثمن فوجود Indexes كثيرة يؤثر سلبا على الاضافة و الحذف و التعديل لان ببساطة كلما قمت باي عملية اضافة او حذف او تعديل يتم تعديل البيانات داخل ال Indexes و ايضا كثرة وجود Indexes تؤدي لزيادة حجم البيانات لان ال Indexes لها تخزين مستقل عن تخزين البيانات الفعلية
ولذلك يجب انشاء ال Indexes بعناية حتى نتجنب اي آثار سلبية

ليست هناك تعليقات:

مقدمة عن الDevOps

في هذا المقال سوف اتحدث عن مقدمة بسيطة عن ال DevOps ولماذا لابد ان تهتم فرق تطوير البرمجيات به وما هي النتائج المترتبة عن استخدام اساليبه ...