سؤال

من أجل المتعة ، كنت ألعب مع المحسن المدمج لـ 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].

ماذا تخبرك خطة أوراكل التي تشرح عن الاستفسارين؟

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