الدوال المعرّفة من المستخدم
الفهرسة القائمة على الدوال نهج عام جداً. فإلى جانب دوال مثل UPPER، يمكنك أيضاً فهرسة تعبيرات مثل A + B، بل واستخدام دوال معرّفة من المستخدم في تعريف الفهرس.
وهناك استثناء مهم واحد. فمثلاً، لا يمكن الإشارة إلى الوقت الحالي في تعريف فهرس، لا مباشرةً ولا غير مباشرة، كما في المثال التالي.
CREATE FUNCTION get_age(date_of_birth DATE)
RETURN NUMBER
AS
BEGIN
RETURN
TRUNC(MONTHS_BETWEEN(SYSDATE, date_of_birth)/12);
END
تستخدم دالة GET_AGE التاريخ الحالي (SYSDATE) لحساب العمر بناءً على تاريخ الميلاد المقدَّم. ويمكنك استخدام هذه الدالة في جميع أجزاء استعلام SQL، مثلاً في select وعبارة where:
SELECT first_name, last_name, get_age(date_of_birth)
FROM employees
WHERE get_age(date_of_birth) = 42
يسرد الاستعلام جميع الموظفين الذين عمرهم 42 سنة. واستخدام فهرس قائم على دالة فكرة بديهية لتحسين هذا الاستعلام، لكنك لا تستطيع استخدام الدالة GET_AGE في تعريف الفهرس لأنها ليست حتمية (deterministic). ويعني ذلك أن نتيجة نداء الدالة لا تحدّدها معاملاتها تحدّداً كاملاً. ولا يمكن فهرسة إلا الدوال التي تعيد النتيجة نفسها دائماً للمعاملات نفسها—أي الدوال الحتمية.
إن أعجبك هذا الموضوع، قد يعجبك أيضاً…
… أن تشترك في القوائم البريدية، وتحصل على ملصقات مجانية، وتشتري كتابي، أو تنضم إلى دورة تدريبية.
والسبب وراء هذا القيد بسيط. عند إدراج صف جديد، تنادي قاعدة البيانات (database) الدالة وتخزّن النتيجة في الفهرس، وتبقى هناك دون تغيير. فلا توجد عملية دورية تحدّث الفهرس. ولا تحدّث قاعدة البيانات العمر المفهرس إلا عندما يتغير تاريخ الميلاد بعبارة update. وبعد عيد الميلاد التالي، يصبح العمر المخزّن في الفهرس خاطئاً.
وإلى جانب كونها حتمية، تشترط قاعدتا بيانات PostgreSQL وOracle أن تُعلَن الدوال حتمية عند استخدامها في فهرس، لذا عليك استخدام الكلمة المفتاحية DETERMINISTIC (في Oracle) أو IMMUTABLE (في PostgreSQL).
تنبيه
تثق قاعدتا بيانات PostgreSQL وOracle بإعلانَي DETERMINISTIC أو IMMUTABLE—أي أنها تثق بالمطوّر.
ويمكنك إعلان الدالة GET_AGE حتمية واستخدامها في تعريف فهرس. وأياً كان الإعلان، فإنها لن تعمل كما هو مقصود لأن العمر المخزّن في الفهرس لن يزداد بمرور السنين؛ فلن يتقدم الموظفون في العمر—على الأقل ليس في الفهرس.
ومن الأمثلة الأخرى على الدوال التي لا يمكن «فهرستها» مولّدات الأرقام العشوائية والدوال التي تعتمد على متغيّرات البيئة.
ملاحظة
لا تستطيع Db2 (LUW) استخدام الدوال المعرّفة من المستخدم في الفهارس (ولا حتى إذا كانت حتمية).
فكّر في الأمر
كيف يمكنك مع ذلك استخدام فهرس لتحسين استعلام عن جميع الموظفين الذين عمرهم 42 سنة؟