محاكاة الفهارس الجزئية في قاعدة بيانات Oracle
يمكن استخدام الطريقة الغريبة التي تتعامل بها قاعدة بيانات Oracle مع NULL في الفهارس لمحاكاة الفهارس الجزئية؛ إذ يكفي أن نستخدم NULL للصفوف التي لا ينبغي فهرستها.
وللتوضيح، نحاكي الفهرس الجزئي التالي:
CREATE INDEX messages_todo
ON messages (receiver)
WHERE processed = 'N'
أولاً، نحتاج إلى دالة تعيد قيمة RECEIVER فقط إذا كانت قيمة PROCESSED تساوي 'N'.
CREATE OR REPLACE
FUNCTION pi_processed(processed CHAR, receiver NUMBER)
RETURN NUMBER
DETERMINISTIC
AS BEGIN
IF processed IN ('N') THEN
RETURN receiver;
ELSE
RETURN NULL;
END IF;
END
ويجب أن تكون الدالة حتمية لتُستخدم في تعريف فهرس.
إن أعجبك هذا الموضوع، قد يعجبك أيضاً…
… أن تشترك في القوائم البريدية، وتحصل على ملصقات مجانية، وتشتري كتابي، أو تنضم إلى دورة تدريبية.
الآن يمكننا إنشاء فهرس يحتوي فقط الصفوف التي تكون فيها PROCESSED='N'.
CREATE INDEX messages_todo
ON messages (pi_processed(processed, receiver))
لاستخدام الفهرس، يجب استخدام التعبير المفهرس في الاستعلام:
SELECT message
FROM messages
WHERE pi_processed(processed, receiver) = ?
----------------------------------------------------------
|Id | Operation | Name | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT | | 5330 |
| 1 | TABLE ACCESS BY INDEX ROWID| MESSAGES | 5330 |
|*2 | INDEX RANGE SCAN | MESSAGES_TODO | 5303 |
----------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("PI_PROCESSED"("PROCESSED","RECEIVER")=:X)
الفهارس الجزئية، الجزء الثاني
بدءاً من الإصدار 11g، يوجد نهج ثانٍ — مخيف بالقدر نفسه — لمحاكاة الفهارس الجزئية في قاعدة بيانات Oracle، وذلك باستخدام قسم فهرس معطَّل عمداً والمعامل SKIP_UNUSABLE_INDEXES.