الفهارس الجزئية
حتى الآن لم نناقش سوى الأعمدة التي تُضاف إلى الفهرس. ومع الفهارس الجزئية (partial) في PostgreSQL أو المُرشَّحة (filtered) في SQL Server، يمكنك أيضاً تحديد الصفوف التي تُفهرس.
تنبيه
لقاعدة بيانات Oracle نهج فريد في الفهرسة الجزئية؛ ويشرحه القسم التالي بالبناء على هذا القسم.
ولا تدعم Db2 (LUW) الفهارس الجزئية، لكن يمكن محاكاتها كما في قاعدة بيانات Oracle عند استخدام ميزة EXCLUDE NULL KEYS.
يُفيد الفهرس الجزئي في شروط where الشائعة التي تستخدم قيماً ثابتة — مثل رمز الحالة في المثال التالي:
SELECT message
FROM messages
WHERE processed = 'N'
AND receiver = ?
الاستعلامات كهذا شائعة جداً في أنظمة الطوابير؛ إذ يجلب الاستعلام جميع الرسائل غير المعالَجة لمستلم معيّن. أما الرسائل التي عُولجت بالفعل فنادراً ما تُحتاج، وإذا احتيج إليها فالوصول إليها يكون عادةً بمعيار أكثر تحديداً مثل المفتاح الأساسي.
يمكننا تحسين هذا الاستعلام بفهرس من عمودين. وبالنظر إلى هذا الاستعلام وحده، لا يهم ترتيب الأعمدة لعدم وجود شرط نطاق.
CREATE INDEX messages_todo
ON messages (receiver, processed)
يؤدي الفهرس غرضه، لكنه يشمل صفوفاً كثيرة لا يُبحث فيها أبداً، وهي جميع الرسائل التي عُولجت بالفعل. ومع ذلك يجعل الفهرس الاستعلام سريعاً جداً بفضل قابلية التوسع اللوغاريتمية، وإن كان يهدر مساحة قرص كبيرة.
ومع الفهرسة الجزئية يمكنك قصر الفهرس على الرسائل غير المعالَجة فقط. وصيغة ذلك بسيطة إلى حد مفاجئ: جملة where.
CREATE INDEX messages_todo
ON messages (receiver)
WHERE processed = 'N'
لا يحتوي الفهرس إلا الصفوف التي تستوفي جملة where. وفي هذه الحالة تحديداً، يمكننا حتى حذف العمود PROCESSED لأنه دائماً 'N' على أي حال. ويعني ذلك أن الفهرس يقلّص حجمه في بُعدين: عمودياً لأنه يحتوي صفوفاً أقل، وأفقياً بسبب حذف العمود.
إن أعجبك هذا الموضوع، قد يعجبك أيضاً…
… أن تشترك في القوائم البريدية، وتحصل على ملصقات مجانية، وتشتري كتابي، أو تنضم إلى دورة تدريبية.
لذلك يكون الفهرس صغيراً جداً. وفي حالة طابور، قد يعني ذلك حتى أن حجم الفهرس يبقى دون تغيير رغم نمو الجدول بلا حدود؛ فالفهرس لا يحتوي جميع الرسائل بل غير المعالَجة فقط.
ويمكن أن تصبح جملة where لفهرس جزئي معقدة اعتباطياً. والقيود الجوهرية الوحيدة تتعلق بالدوال: فلا يمكنك استخدام سوى الدوال الحتمية كما هو الحال في كل تعريف فهرس. غير أن لـSQL Server قواعد أكثر تقييداً ولا تسمح بالدوال ولا بالمعامل OR في مُسندات الفهرس.
وتستطيع قاعدة البيانات استخدام فهرس جزئي كلما ظهرت جملة where في استعلام.
فكّر في الأمر
ما الخصوصية التي يمتلكها أصغر فهرس ممكن للاستعلام التالي:
SELECT message
FROM messages
WHERE processed = 'N'