استبدال القيمة الفارغة على ثابت
سؤال
من أجل المتعة ، كنت ألعب مع المحسن المدمج لـ Oracle in Toad اليوم. أحد التحسينات التي تقترحها هي ما يلي
AND emp.pay_type = NVL('FT', UID)
بدلاً من
AND emp.pay_type = 'FT'
أنا في حيرة من أمري بشأن ما يحدث هنا وبسبب ذلك ، مرتبك أيضًا حول سبب تحسين هذا الأداء. نظرًا لأن FT عبارة عن سلسلة حرفية داخل استعلام SQL ، وبالتالي لا توجد أبدًا ، فلماذا يحدث هذا أي فرق؟ أظن أنه له علاقة بالفهرس الحالي في الحقل ، لكنني غير قادر على العثور على أي شيء في مستندات Oracle.
المحلول
هذه نصيحة غريبة. تعمل وظيفة NVL مثل هذا:
NVL(exp1, val1)
إذا لم يكن "exp1" فارغًا ، فسيتم إرجاعه ؛ وإلا يتم إرجاع "Val1".
نظرًا لأن "ft" في المثال لا يمكن أن يكون فارغًا ، فلا فائدة من استخدام وظيفة NVL ، وعقوبة أداء صغيرة (على الأقل لمحسّن أن يعمل على أن NVL زائدة أن NVL زائدة عن الحاجة).
إذا قرأت الحالة:
و emp.pay_type = nvl ("ft" ، UID)
ثم قد يكون هناك فائدة. هنا لدينا معرف محدد (اسم العمود مغلق في عروض أسعار مزدوجة) وربما تكون قيمة العمود فارغة ؛ تضمن مكالمة NVL إرجاع NULL فقط إذا كانت "Ft" فارغة و UID فارغ. UID هو ، بالطبع ، معرف منتظم.
قد يكون من المنطقي أن تقرأ الشرط:
AND emp.pay_type = NVL(UID, 'FT')
الآن إذا كانت قيمة UID فارغة ، فسيتم استخدام القيمة الافتراضية "ft" كـ pay_type المقابلة.
نصائح أخرى
كنت آخذ "اقتراحات التحسين" في TOAD مع الحبوب الضخمة من الملح. أسميهم طريقة "البندقية" للتحسين - قم بإطلاق النار على مجموعة كبيرة من البتات المختلفة على الهدف ومعرفة أي واحد منهم يضرب ، بطريقة ما :)
على أي حال ، الفرق بين
AND emp.pay_type = NVL('FT', UID)
و
AND emp.pay_type = 'FT'
هو أنه في الحالة الثانية ، قد يستخدم المحسن إحصائيات الرسم البياني على العمود (إذا تم جمعها) للحصول على تقدير أكثر دقة لعدد الصفوف المطابقة. ومع ذلك ، عند استخدام NVL ، لن يكتشف المحسن (على ما أظن) أنه يمكن أن يتجاهل NVL ، وبالتالي لن يتحقق من الرسم البياني للقيمة.
هذه ليست طريقة تحسين سأستخدمها بشكل عام. هناك طرق أفضل للتحكم في مسار تنفيذ الاستعلام (تلميحات ، على سبيل المثال). على وجه الخصوص ، ستفشل هذه الطريقة إذا قاموا بتحسين البنك المركزي العماني للبحث عن التعليمات البرمجية الزائدة وتحسينها NVL([literal value],[anything])
ل [literal value]
.
ماذا تخبرك خطة أوراكل التي تشرح عن الاستفسارين؟