Беглый взгляд, без понимания ваших данных, отношений, томов, индексов, секционирования, процессора и т. Д. c.
(1) При первом внешнем выборе (т. Е. Перед UNION) у вас, похоже, есть фильтр WHERE VALUE = 1
, где значение фактически равно soe.value
. Во внутреннем выборе у вас есть условие ((soi.value = 0) OR (soi.value = 1 AND festpae_id IS NOT NULL))
. Разве не достаточно просто использовать soi.value = 1 AND festpae_id IS NOT NULL
во внутреннем выборе и избегать внешнего выбора? Какое soi.value вы ищете?
(2) Аналогично, во втором выборе у вас есть LEFT JOIN srv_obj_intermediate soi ON soi.stya_id = sta.id
, а далее у вас есть фильтр AND soi.value IS NULL
. Опять же, что soi.value
вы ищете?
(3) Рассмотрите возможность перемещения предиката фильтра oet.code под предложением where и используйте JOIN order_event oet ON eax.ordet_id = oet.id
по причинам, указанным здесь , хотя это не гарантирует улучшения производительности. Вам необходимо проверить, изменяется ли и как план выполнения в каждом конкретном случае.
(4) Обновлены ли статистические данные по всем этим таблицам?
(5) Рассматривали ли вы план ? Вы пропускаете какие-либо объединения и / или имеете в плане декартовы объединения? Вы видите полное сканирование таблицы, когда ожидаете использования индекса или сокращения раздела? Эта белая книга является хорошей отправной точкой, если вы не знакомы с планами объяснения.