المتابعون للمدونة

الأحد، 1 مايو 2016

فهارس قاعدة البيانات Indexes


فهارس قاعدة البيانات Indexes:

افترض أنّك تريد أن تبحث عن قيمة معيّنة في عمود في أحد الجداول، كالبحث مثلا عن (عباس العقاد) في حقل المؤلفين.. أوّل ما سيجول بذهنك هو أنّ الحاسب سيفحص أسماء المؤلفين واحدا وراء الآخر من البداية إلى النهاية.. ربّما تبدو هذه الطريقة سهلة، ولكنّها أسوأ طريقة يمكن البحث بها، لأنها قد تتسبّب في بطءٍ شنيع في أداء البرنامج، خاصّة أنّ الجدول قد يحتوي على عدد كبير من الصفوف، قد يصل إلى عشرات أو مئات الآلاف، وكل خانة من خاناته قد تحتوي على نصوص طويلة، وأنت تعرف أن مقارنة عددين تتم بمقارنة الوحدات الثنائية Bytes في كل منهما (لهذا يحتاج العدد الصحيح int مثلا إلى أربع عمليات مقارنة)، بينما تحتاج مقارنة نصين إلى مقارنة حروف كل منهما، مما يزيد كثيرا من عمليات المقارنة، فقد تحتاج قاعدة البيانات إلى إجراء 50 عملية لمقارنة نصين اثنين يتكون كل منهما من 50 حرفا بافتراض أسوأ حالة ممكنة، وهي تشابه أول 49 حرفا في النصين!.. هذا مع العلم بأن حقول النصوص قد تحتوي على نصوص أطول من هذا بكثير!

لمثل هذه التحديات، توجد العديد من الطرق لتسريع عملية البحث، تبدأ بترتيب العمود أبجديّا، لأنّ البحث في عمود مرتب أسرع بكثير من البحث في عمود عشوائيّ، خاصّة مع استخدام طريقة بحث جيّدة، مثل البحث الثنائي Binary Search.

ولكن، رغم سرعة عملية البحث بعد الترتيب، فقد يكون الترتيب نفسه مأساة!.. هل تتخيّل كم من الوقت يمكن أن يضيّعه برنامجك لترتيب خمسين ألف نصّ مثلا، يتكون كل منها في المتوسط من 30 حرفا؟.. فما بالك إذن حينما يقوم البرنامج بتكرار البحث في نفس العمود أكثر من مرّة؟!

إذن فما الحل؟

الحل هو أن نرتب بيانات العمود في قاعدة البيانات منذ البداية، وبهذا نضمن سرعة البحث، دون الحاجة إلى تكرار عملية الترتيب في كل مرة.. لكن هذا يقودنا إلى سؤال آخر: وماذا لو كان الجدول يحتوي على أكثر من عمود تحتاج للبحث فيها، فتبعا لأيّ منها سوف نرتب الجدول؟!!

هنا يبرز حل رائع اسمه الفهارس Indexes:

تخيّل أننا طلبنا من قاعدة البيانات إنشاء فهرس Index لعمود الأسماء في جدول المؤلفين.. هنا سيتم إنشاء فهرس يحتفظ ببيانات توضح موضع كل مؤلف في الترتيب الهجائي.. فمثلا، إذا كان توفيق الحكيم هو المؤلف رقم 1 في الجدول، ونبيل فاروق هو المؤلف رقم 7، وأحمد خالد توفيق هو المؤلف رقم 10، فسيحتفظ الفهرس بمعلومات تفيد بأن أول مؤلف في الترتيب الأبجدي يوجد في الصف رقم 10، يليه في الترتيب المؤلف الذي يقع في الصف رقم 1، يليه المؤلف الذي يقع في الصف رقم 7.. هذا يحقق لنا الفوائد التالية:

-  يمكن استخدام هذا الفهرس لتطبيق خوارزميات البحث على عمود المؤلفين وكأنه عمود مرتب، وبالتالي ستكون عمليّة البحث أسرع.

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

-  يمكننا إنشاء أكثر من فهرس لأكثر من عمودٍ في نفس الجدول، ممّا يعني قدرتنا على البحث في كل هذه الأعمدة كأنها مرتبة.

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

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

 

ملحوظة:
بمجرد جعل الحقل مفتاحا أساسيا للجدول، يتم إنشاء فهرس له، نظرا لأن المفتاح الرئيسي يستخدم بغزارة في الاستعلامات التي تبحث عن سجلات معينة في الجدول، خاصة مع استخدامها في علاقات مع جداول أخرى.

 

ولكن.. للأسف لا توجد طريقة مثاليّة، فهناك عيبان أساسيّان للفهارس:

1- يتمّ حفظ الفهارس في قاعدة البيانات، فتؤدي إلى زيادة حجمها.. لهذا إذا كان حجم قاعدة بياناتك كبيرا، فلا بدّ أن توازن بين حاجتك إلى توفير الوقت وحاجتك إلى توفير الحجم.. لكني لا أظن هذه مشكلة كبيرة اليوم، مع السعات الهائلة لوسائط التخزين.

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

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

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

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

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

وكقاعدة: أنشئ فهارس للحقول النصية التي تتوقع أن يحتاج مستخدمو برنامجك للبحث فيها بغزارة.

 

وسنتعرّف على كل هذه المفاهيم عمليّا، أثناء إنشاء قواعد البيانات، وأثناء استخدامها من خلال برامجنا.

من كتاب: من الصفر إلى الاحتراف برمجة قواعد البيانات في فيجوال بيزيك دوت نت ADO .NET

للتنزيل من مكتبة الكتب العربية برابط مباشر:

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

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر