محدد الفهرس او ما يعرف ب INDEX هو نوع مهم جدا من أنواع المحددات. والغاية الأساسية منه هو زيادة كفاءة و سرعة استرجاع البيانات من قاعدة البيانات. في قواعد البيانات الضخمة التي تحتوي على الملايين من السجلات تلعب الفهارس دور مهم جدا في عملية استرجاع البيانات بسرعة معقولة بحيث لا يشعر المستخدم ببطىء في عرض البيانات. طبعا هناك العديد من النقاط الأخرى التي تؤثر على كفاءة الاستعلامات SQL queries سوف نتطرق لها لاحقا عندما نشرح موضوع الاستعلامات SQL queries.
تعريف الفهرس هو عبارة عن قيم مفتاحية key values وهذه القيم سوف تؤخذ من أعمدة column الجدول التي يتم إضافتها إلى الفهرس ويتم تخزين هذه القيم في بناء خاص يسمى B-Tree وعندما يحتاج SQL SERVER إلى استرجاع بيانات محددة سوف يستخدم B-tree structure للوصول وبشكل سريع وفعال إلى مجموعة البيانات المطلوبة.
بصورة عامة هناك نوعين من الفهارس وكما يلي :
Clustered Index:
=============
كل جدول يمكن أن يمتلك فهرس واحد فقط من نوع clustered index. وهذا شيء مهم يجب تذكره. الفهارس العنقودية بصورة عامة تكون أسرع من النوع الثاني وهو الفهرس الغير عنقودي والسبب في ذلك هو أن الفهرس العنقودي سوف يقوم بتخزين بيانات الجدول بشكل مرتب حسب القيم المفتاحية key values الفهرس وهذه القيم تمثل الحقول التي تم استخدامها لتكوين الفهرس. بعبارة أخرى الفهرس العنقودي clustered index سوف يقوم بخزن أسطر البيانات بالتسلسل sort اعتمادا على القيم المفتاحية. مثلا في جدول الزبائن اذا استخدمنا حقل معرف الزبون CUST_ID لتكوين clustered index فإن نظام إدارة قواعد البيانات سوف يخزن الأسطر بشكل مرتب حسب قيمة الحقل CUST_ID فأذا أدخلنا في اول سطر قيمة حقل CUST_ID مثلا ID0008 وفي السطر الثاني أدخلنا قيمة CUST_ID مثلا ID0005 سوف يقوم نظام إدارة قواعد البيانات بأعادة ترتيب الأسطر في الجدول بحيث يكون السطر الثاني مخزن اولا ثم يليه السطر الأول وذلك لان قيمة فهرس السطر الثاني اقل ولهذا السبب لا يمكن استخدام أكثر من clustered index للجدول الواحد لانه فعليا لا يمكن تخزين البيانات باكثر من ترتيب واحد.
اذا تمت اضافة فهرس عنقودي clustered index إلى احد الجداول فإن هذا الجدول يعرف بأنه جدول عنقودي clustered table. واذا كان الجدول لا يمتلك فهرس عنقودي فيعرف بأنه heap.
Nonclustered
============
النوع الثاني وهو الفهرس الغير عنقودي ، في هذا النوع سوف يقوم النظام بخزن القيم المفتاحية ولكن ضمن تركيب structure منفصل عن صفوف البيانات ، تمتلك القيم المفتاحية جزء إضافي يسمى مؤشر pointer وهذا المؤشر يشير إلى صف البيانات الفعلي ويسمى هذا المؤشر بمحدد الصف row locater. لفهم هذا التعريف سوف ناخذ المثال السابق وهو جدول الزبائن اذا قمنا بإضافة فهرس غير عنقودي الحقل معرف الزبون CUST_ID سوف يقوم نظام إدارة قواعد البيانات بتكوين تركيب منفصل يستخدمه لخزن القيم المفتاحية لحقل CUST_ID ولا يقوم بأعادة ترتيب البيانات في جدول الزبائن عكس الفهرس العنقودي الذي يقوم بذلك. فأذا أدخلنا في اول سطر قيمة حقل CUST_ID مثلا ID0008 وفي السطر الثاني أدخلنا قيمة CUST_ID مثلا ID0005 سوف يبقي النظام السطر الأول في نفس تسلسله داخل الجدول ولكن سوف يقوم بأعادة ترتيب القيم ضمن التركيب المنفصل بحيث تكون القيمة المفتاحية للسطر الثاني اولا تليه القيمة المفتاحية للسطر الأول. إضافة إلى ذلك سوف يمتلك هذا التركيب ما يعرف بمحدد الصف row locater والذي يخبر نظام إدارة قواعد البيانات بأن هذه قيمة تعود للسطر الأول في الجدول والقيمة الأخرى تعود للسطر الثاني وهكذا.
لفهم طريقة العمل بشكل ادق نفترض أن قاعدة البيانات تنفذ استعلام على جدول الزبائن لجلب او عرض بيانات الزبون حسب رقم المعرف وكما يلي
SELECT * FROM CUTOMER_TBL WHERE CUST_ID ='ID0005'
سوف يقوم نظام إدارة قواعد البيانات للبحث في تركيب الخاص بلفهرس غير العنقودي ويسترجع منه بسرعة كبيرة قيمة بمحدد الصف row locater ثم يذهب إلى جدول الزبائن وعن طريق قيمة محدد الصف التي حصل عليها سوف يقوم بجلب او عرض بيانات السطر الذي تكون فيه قيمة معرف الزبون هي ='ID0005
أما إذا كان الجدول لا يمتلك فهرس سواء كان عنقودي أو غير عنقودي سوف يقوم نظام إدارة قواعد البيانات بالبحث خلال أسطر الجدول إلى أن يصل إلى السطر المطلوب. عملية البحث هذه قد لا تستغرق وقت طويل في الجداول الصغيرة ولكن في جدول يحتوي ملايين الأسطر قد تأخذ مثل هذا العملية وقت طويل نسبيا وقد تؤدي إلى بطىء بشكل محسوس في التطبيق. لذا من المهم جدا عند تصميم قواعد البيانات يجب أن نعرف مسبقا ما هو الاحتمال الأكبر لعدد الأسطر التي سوف تخزن في هذا الجدول او ذاك وبنفس الوقت نحاول حصر ما هي أكثر الاستعلامات تنفيذا على هذا الجدول وتبعا لذلك نقوم بتصميم الفهارس التي سوف تساعد بتحسين أداء النظام.
ولكن هناك نقطة مهمة يجب الانتباه إليها وكما يقال الزائد كل الناقص. ان إضافة عدد كبير من الفهارس قد يؤدي إلى سرعة في استرجاع البيانات عند تنفيذ عبارة SELECT ولكن قد يؤدي إلى بطىء في عمليات تعديل واضافة البيانات INSERT / UPDATE والسبب في ذلك هو في كل مرة نقوم بها بخزن سطر جديد او تعديل سطر موجود سوف يقوم نظام إدارة قواعد البيانات بأعادة ترتيب الفهارس وهذه العملية قد تستغرق وقت طويل اذا كان هناك عدد كبير من الفهارس . لذلك عند تصميم الفهارس يجب اخذ ذلك بنظر الاعتبار ويجب عمل توازن بين سرعة ايعازات استرجاع البيانات وسرعة ايعازات إدخال وتعديل البيانات.
فيما يلي مثال حول إضافة الفهارس
--Create a clustered index on a table
CREATE CLUSTERED INDEX Index1 ONCUTOMER_TBL (CUST_ID) ;
--Create a nonclustered index on a table
CREATE NONCLUSTERED INDEX Index1 ONCUTOMER_TBL (CUST_ID) ;
ليست هناك تعليقات:
إرسال تعليق