При использовании объединения все показатели производительности снижаются в Oracle View

#oracle #select #view #union-all

#Oracle #выберите #Вид #объединение -все

Вопрос:

Я создал ниже представление oracle, в котором я добавил запрос select в union all, который отлично работает с ожидаемым результатом, но внезапно производительность представления стала очень низкой. Таблица IS_ID содержит 510000 записей.

Я действительно не понимаю, поскольку при добавлении этого UNION ALL запроса select только что добавлено 400 дополнительных строк в представлении, но все же почему производительность сейчас очень низкая. Основной причиной низкой производительности является приведенное ниже утверждение, в union all котором блокируется представление. Могу ли я распространить union all или приведенное ниже утверждение IS_TRE view в другое представление для повышения производительности или как я могу переписать приведенное ниже утверждение для повышения производительности?

 WHERE
        FUND_ISIN NOT IN
                         (
                         SELECT DISTINCT
                             FUND_ISIN
                         FROM
                             IS_ID
                         WHERE
                             MEMBER_DESCR ='O')
  

Комментарии:

1. Является ли запрос проблемой с производительностью select * from is_tre или ваш фактический запрос выполняет что-то еще?

2. я использую это представление в другом представлении TT_RE, и это представление вызывает проблемы с производительностью … если я удалю эту часть из представления IS_TRE, то в другом представлении TT_RE не возникло никаких проблем с производительностью… основная проблема связана с этим сообщением: FUND_ISIN НЕ ВКЛЮЧЕН (ВЫБЕРИТЕ DISTINCT FUND_ISIN ИЗ IS_ID, ГДЕ MEMBER_DESCR =’O’)

3. я думаю, что приведенное выше утверждение каким-то образом блокирует представление IS_TRE .. можем ли мы разделить и распределить объединение all в другом представлении, а также внутреннюю часть запроса select из объединения all, чтобы посмотреть, улучшает ли это производительность?

4. Итак, медленный запрос — это запрос, который ссылается на другое представление, которое зависит от этого представления? Вы должны понимать, что Oracle принимает весь запрос и может переписать его в любом случае, что является законным, чтобы он работал наилучшим образом. Он смог что-то сделать и предложить план быстрого выполнения ваших требований без этого дополнительного union all (который имеет всевозможные ограничения на преобразование запроса — которые можно обойти, если вы можете видеть запрос).

5. «Блокировка представления» не имеет никакого смысла, вы, вероятно, имели в виду, что дополнительная работа, необходимая для вычисления дополнительных строк набора, увеличивает время выполнения. «Можем ли мы разделить и распределить объединение в разных представлениях ..» что вы имеете в виду? Я предлагаю вам включить все требуемые определения представлений и полный медленный оператор SQL. Для получения бонусных баллов укажите план выполнения с дополнительным и без дополнительного union all .

Ответ №1:

Я дал вам несколько комментариев о том, почему происходит так много событий, которыми вы делитесь. Но в целом это халява

 SELECT 
    FUND_ISIN,    
    MAX(FUND_QUOTE_CRNY),    
    'O' AS MEMBER_DESCR,
    100 - SUM(MEMBER_RATIO),
    'Other total'
FROM
    IS_ID 
    WHERE
    FUND_ISIN NOT IN
                     (
                     SELECT DISTINCT
                         FUND_ISIN
                     FROM
                         IS_ID
                     WHERE
                         MEMBER_DESCR ='O')
GROUP BY
    FUND_ISIN;
  

Может быть перезаписан в

 SELECT 
    FUND_ISIN,    
    MAX(FUND_QUOTE_CRNY),    
    'O' AS MEMBER_DESCR,
    100 - SUM(MEMBER_RATIO),
    'Other total'
FROM
    IS_ID
GROUP BY
    FUND_ISIN
HAVING sum(case when MEMBER_DESCR ='O' then 1 else 0 end) = 0
  

И, вероятно, он будет работать лучше.

Неизвестно, влияет ли это на ваш реальный сценарий.

Комментарии:

1. спасибо, теперь он работает и работает намного лучше, как и ожидалось

2. теперь мы знаем, что производительность улучшается с изменениями sql … тем не менее, вы видите какие-либо другие варианты, где мы можем попробовать альтернативу этому представлению для повышения производительности или, возможно, изменения sql? Затем я могу это протестировать…

3. Если вы не предоставите дополнительную информацию, я бы просто кололся в темноте, я использую свой хрустальный шар только один раз в день на человека. Нам нужен полный SQL, который вы выполняете, и соответствующие определения представления, а также полный план выполнения.

Ответ №2:

вы можете попробовать NOT EXISTS и посмотреть, поможет ли это

 FROM
    IS_ID OUT_Q
    WHERE
    FUND_ISIN NOT EXISTS
                     (
                     SELECT 'X' FROM IS_ID IN_Q
                     WHERE MEMBER_IN_Q.DESCR ='O'  AND OUT_Q.COLUMNS_MAKING_UP_THE_UNIQE_KEY
                          = IN_Q.COLUMNS_MAKING_UP_THE_UNIQE_KEY
)