كيف يمكن أن يؤدي الضغط على العرض المضمّن إلى إبطاء الاستعلام؟
-
20-08-2019 - |
سؤال
لقد ورثت استعلامًا فوضويًا إلى حد ما وأعمل على إعادة هيكلته لأكون فعالاً.
أثناء هذه العملية، كان أحد الأشياء التي قمت بها بسبب التفضيل الشخصي هو تغيير كافة صيغ ربط ANSI-99 من عبارات "الربط الداخلي" و"الربط الخارجي الأيسر" لتكون مسندات في الاستعلام.لقد لاحظت شيئين غريبين للغاية وسأكون ممتنًا لتفسيرهما.
- أدى تغيير الصلات من بناء جملة "INNER JOIN..." إلى تغيير خطة الشرح.باستخدام بناء الجملة ANSI 99، قامت Oracle بإجراء فحص كامل للجدول على الأعمدة التي تم ضمها.بعد تغيير بناء جملة الصلة، أصبح الآن يدفع المسند.لماذا يغير بناء جملة الانضمام خطة الشرح؟
- لقد أدى ضغط المسند على العرض المضمن إلى إبطاء الاستعلام بفارق كبير جدًا.الاستعلام الذي كان قيد التشغيل (قبل تغيير الصلات) في حوالي 3 ثوانٍ.الآن يستغرق 9 ثواني.لأكون صادقًا، أنا جديد إلى حد ما في قراءة خطط الشرح، لذلك من الممكن تمامًا أن تكون إعادة هيكلة الاستعلام قد أدت إلى إبطائه لسبب مختلف.لكن سؤالي في النهاية هو:"هل من الممكن أن يؤدي ضغط المسند على الأعمدة المفهرسة إلى إبطاء الاستعلام بشكل كبير؟إذا كان الأمر كذلك لماذا؟"
شكرا على الردود، وأعتذر إذا لم يكن الأمر واضحا تماما...
المحلول
هل من الممكن أن يقوم المسند بالضغط على الأعمدة المفهرسة لإبطاء الاستعلام بشكل كبير؟إذا كان الأمر كذلك لماذا؟
بالفعل انه كذلك.
كقاعدة عامة، دفع المسند يجعل المحسن يختار NESTED LOOPS
بدلاً من HASH JOIN
.
يمكن أن يكون هذا أبطأ إذا لم تكن الحالة انتقائية.
هذا الاستعلام
SELECT *
FROM table1, t1
(
SELECT /*+ NO_PUSH_PRED */
*
FROM table2 t2
WHERE t2.col1 = :value1
) t2o
WHERE t2o.col2 = t1.col2
على الأرجح سيتم إنشاء جدول تجزئة فوق محتويات table1
وسيتم فحص الصفوف التي تم إرجاعها بواسطة العرض مقابل جدول التجزئة هذا (أو العكس).
هذا الاستعلام:
SELECT *
FROM table1, t1
(
SELECT /*+ PUSH_PRED */
*
FROM table2 t2
WHERE t2.col1 = :value1
) t2o
WHERE t2o.col2 = t1.col2
سوف تستخدم NESTED LOOPS
ومؤشر على (t2.col1, t2.col2)
إذا تم تعريفه.
هذا الأخير أكثر كفاءة إذا col2
انتقائي على table2
, وأقل كفاءة إذا لم يكن الأمر كذلك.
تخميني المدروس هو أن هذا هو بالضبط ما يحدث في حالتك.
إذا قمت بنشر استفساراتك وخطط التنفيذ، فمن المحتمل أن أتمكن من إخبار المزيد.