سؤال

أفهم أن القيم الخالية غير قابلة للفهرسة في DB2، لذا بافتراض أن لدينا جدول ضخم (المبيعات) مع عمود تاريخ (تم بيعه) والذي عادة ما يكون تاريخًا، ولكنه في بعض الأحيان (10٪ من الوقت) فارغ.

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

يمكننا أن نجعل الاستعلام التالي سريعًا عن طريق وضع فهرس على العمودين "sold_on" و"الإجمالي".

Select * from Sales 
where 
Sales.sold_on between date1 and date2
and Sales.total = 9.99

لكن الفهرس لن يجعل هذا الاستعلام أسرع:

Select * from Sales 
where 
Sales.sold_on is null
and Sales.total = 9.99

لأن الفهرسة تتم على القيمة.

هل يمكنني فهرسة القيم الخالية؟ربما عن طريق تغيير نوع الفهرس؟فهرسة عمود المؤشر؟

هل كانت مفيدة؟

المحلول

أنا لست خبيرًا في DB2، ولكن إذا كانت 10% من قيمك فارغة، فلا أعتقد أن الفهرس الموجود في هذا العمود وحده سيساعد في استعلامك على الإطلاق.10% عدد كبير جدًا بحيث لا يمكن إزعاجك باستخدام فهرس - سيجري فقط فحصًا للجدول.إذا كنت تتحدث عن 2-3%، فأعتقد أنه سيستخدم الفهرس الخاص بك بالفعل.

فكر في عدد السجلات الموجودة على الصفحة/الكتلة - على سبيل المثال 20.سبب استخدام الفهرس هو تجنب جلب الصفحات التي لا تحتاج إليها.احتمالات احتواء صفحة معينة على 0 سجلات فارغة هي (90%)^20، أو 12%.هذه ليست احتمالات جيدة -- ستحتاج إلى جلب 88% من صفحاتك على أي حال، واستخدام الفهرس ليس مفيدًا جدًا.

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

نصائح أخرى

من أين حصلت على الانطباع بأن DB2 لا يقوم بفهرسة القيم الخالية؟لا يمكنني العثور على أي شيء في الوثائق أو المقالات التي تدعم المطالبة.وقد قمت للتو بإجراء استعلام في جدول كبير باستخدام تقييد IS NULL الذي يتضمن عمودًا مفهرسًا يحتوي على جزء صغير من القيم الخالية؛في هذه الحالة، من المؤكد أن DB2 استخدم الفهرس (تم التحقق منه بواسطة EXPLAIN، ومن خلال ملاحظة أن قاعدة البيانات استجابت على الفور بدلاً من قضاء الوقت في إجراء فحص للجدول).

لذا:أدعي أن DB2 ليس لديه مشكلة مع القيم الخالية في فهارس المفاتيح غير الأساسية.

ولكن كما كتب آخرون:قد يتم تكوين بياناتك بطريقة تعتقد DB2 أن استخدام الفهرس لن يكون أسرع.أو أن إحصائيات قاعدة البيانات ليست محدثة للجدول (الجداول) المعنية.

القاعدة الأساسية هي أن الفهرس مفيد للقيم التي تصل إلى 15% من السجلات....لذلك قد يكون الفهرس مفيدًا هنا.

إذا لم يقوم DB2 بفهرسة القيم الخالية، فأنا أقترح إضافة حقل منطقي، IsSold، وتعيينه على القيمة true عندما يتم تعيين تاريخ Selled_on (يمكن القيام بذلك في مشغل).

هذا ليس الحل الأفضل، لكنه قد يكون ما تحتاجه.

ترويلز صحيح.حتى الصفوف التي تحتوي على قيمة SOLD_ON بقيمة NULL ستستفيد من الفهرس الموجود في هذا العمود.إذا كنت تجري عمليات بحث واسعة النطاق على SOLD_ON، فقد تستفيد أكثر من خلال إنشاء فهرس مجمع يبدأ بـ SOLD_ON.في هذا المثال تحديدًا، قد لا يتطلب الأمر الكثير من الحمل الإضافي للحفاظ على ترتيب التجميع استنادًا إلى SOLD_ON، نظرًا لأن الصفوف الأحدث المضافة سيكون لها على الأرجح تاريخ SOLD_ON أحدث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top