استخدم الفهرس يا لوقا! › الفهارس البطيئة، الجزء الأول 5 / 139 السابق التالي

الفهارس البطيئة، الجزء الأول

رغم كفاءة اجتياز الشجرة، لا تزال هناك حالات لا يعمل فيها البحث بالفهرس بالسرعة المتوقعة. وقد غذّى هذا التناقض أسطورة «الفهرس المتدهور» (degenerated index) زمناً طويلاً. وتزعم الأسطورة أن إعادة بناء الفهرس هي الحل المعجزة. ويغطي الملحق بدليل الخرافات هذه الأسطورة وخرافات أخرى بالتفصيل. ويمكنك الآن أن تعتبر من المسلّم به أن إعادة بناء الفهرس لا تحسّن الأداء على المدى الطويل. أما السبب الحقيقي وراء بطء العبارات البسيطة—حتى عند استخدام فهرس—فيمكن تفسيره على أساس الأقسام السابقة.

المكوّن الأول لبطء البحث بالفهرس هو سلسلة عقد الأوراق. تأمّل البحث عن «57» في الشكل 1.3 مرة أخرى. من الواضح أن هناك مدخلين مطابقين في الفهرس. والأدق أن مدخلين على الأقل متماثلان: فقد تحتوي عقدة الورقة التالية مدخلات أخرى لـ«57». ويجب على قاعدة البيانات أن تقرأ عقدة الورقة التالية لترى إن كانت هناك مدخلات مطابقة إضافية. وهذا يعني أن البحث بالفهرس لا يحتاج إلى اجتياز الشجرة فحسب، بل يحتاج أيضاً إلى تتبّع سلسلة عقد الأوراق.

إن أعجبك هذا الموضوع، قد يعجبك أيضاً…

… أن تشترك في القوائم البريدية، وتحصل على ملصقات مجانية، وتشتري كتابي، أو تنضم إلى دورة تدريبية.

المكوّن الثاني لبطء البحث بالفهرس هو الوصول إلى الجدول. فرغم أن عقدة ورقة واحدة قد تحتوي إصابات كثيرة—مئات غالباً—فإن بيانات الجدول المقابلة مبعثرة عادةً عبر كتل جدول كثيرة (انظر الشكل 1.1عقد أوراق الفهرس وبيانات الجدول المقابلة). ويعني ذلك وجود وصول إضافي إلى الجدول مقابل كل إصابة.

يتطلب البحث بالفهرس ثلاث خطوات: (1) اجتياز الشجرة؛ (2) تتبّع سلسلة عقد الأوراق؛ (3) جلب بيانات الجدول. واجتياز الشجرة هو الخطوة الوحيدة التي لها حد أعلى لعدد الكتل المطلوب الوصول إليها—وهو عمق الفهرس. أما الخطوتان الأخريان فقد تحتاجان إلى الوصول إلى كتل كثيرة—وهما سببان للبحث البطيء بالفهرس.

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

INDEX UNIQUE SCAN

تُجري INDEX UNIQUE SCAN اجتياز الشجرة فقط. وتستخدم قاعدة بيانات Oracle هذه العملية إذا كان قيد التفرّد (unique constraint) يضمن ألا يطابق معيار البحث أكثر من مدخل واحد.

INDEX RANGE SCAN

تُجري INDEX RANGE SCAN اجتياز الشجرة وتتبّع سلسلة عقد الأوراق للعثور على جميع المدخلات المطابقة. وهذه هي العملية الاحتياطية إذا كان من المحتمل أن تطابق عدة مدخلات معيار البحث.

TABLE ACCESS BY INDEX ROWID

تسترجع عملية TABLE ACCESS BY INDEX ROWID الصف من الجدول. وتُنفَّذ هذه العملية (غالباً) مقابل كل سجل مطابق من عملية مسح فهرس سابقة.

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