كيف يمكن أن يؤدي الضغط على العرض المضمّن إلى إبطاء الاستعلام؟

StackOverflow https://stackoverflow.com/questions/1044584

سؤال

لقد ورثت استعلامًا فوضويًا إلى حد ما وأعمل على إعادة هيكلته لأكون فعالاً.

أثناء هذه العملية، كان أحد الأشياء التي قمت بها بسبب التفضيل الشخصي هو تغيير كافة صيغ ربط ANSI-99 من عبارات "الربط الداخلي" و"الربط الخارجي الأيسر" لتكون مسندات في الاستعلام.لقد لاحظت شيئين غريبين للغاية وسأكون ممتنًا لتفسيرهما.

  1. أدى تغيير الصلات من بناء جملة "INNER JOIN..." إلى تغيير خطة الشرح.باستخدام بناء الجملة ANSI 99، قامت Oracle بإجراء فحص كامل للجدول على الأعمدة التي تم ضمها.بعد تغيير بناء جملة الصلة، أصبح الآن يدفع المسند.لماذا يغير بناء جملة الانضمام خطة الشرح؟
  2. لقد أدى ضغط المسند على العرض المضمن إلى إبطاء الاستعلام بفارق كبير جدًا.الاستعلام الذي كان قيد التشغيل (قبل تغيير الصلات) في حوالي 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, وأقل كفاءة إذا لم يكن الأمر كذلك.

تخميني المدروس هو أن هذا هو بالضبط ما يحدث في حالتك.

إذا قمت بنشر استفساراتك وخطط التنفيذ، فمن المحتمل أن أتمكن من إخبار المزيد.

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