Использование Union All снижает производительность в Oracle View

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

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

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

person Symonds    schedule 28.10.2020    source источник
comment
Является ли запрос проблемой производительности select * from is_tre или ваш фактический запрос делает что-то еще?   -  person Andrew Sayer    schedule 28.10.2020
comment
Я использую это представление в другом представлении TT_RE, и это представление вызывает проблемы с производительностью ... если я удалю эту часть из представления IS_TRE, тогда другое представление TT_RE не получит никаких проблем с производительностью ... основная проблема связана с этим статусом: FUND_ISIN НЕ ВХОДИТ (ВЫБЕРИТЕ DISTINCT FUND_ISIN FROM IS_ID, WHERE MEMBER_DESCR = 'O')   -  person Symonds    schedule 28.10.2020
comment
Я думаю, что приведенный выше оператор каким-то образом блокирует представление IS_TRE ... можем ли мы разделить и распределить объединение все в другом представлении, а также внутреннюю часть запроса выбора из объединения всех, чтобы увидеть, улучшает ли это производительность?   -  person Symonds    schedule 28.10.2020
comment
Итак, медленный запрос - это запрос, который относится к другому представлению, которое представление полагается на это? Вы должны понимать, что Oracle принимает весь запрос и может переписать его в любом случае, если это законно, чтобы он работал лучше всего. Он смог что-то сделать и предложить план быстрого выполнения для ваших требований без этого дополнительного union all (который имеет всевозможные ограничения на преобразование запроса - это можно обойти, если вы видите запрос).   -  person Andrew Sayer    schedule 28.10.2020
comment
Блокировка представления не имеет никакого смысла, вы, вероятно, имели в виду, что дополнительная работа, необходимая для вычисления дополнительных наборов строк, увеличивает время выполнения. Можем ли мы разделить и распределить союз на всех с разных точек зрения .. что вы имеете в виду? Я предлагаю вам включить все необходимые определения представлений и полный медленный оператор SQL. Для бонусных баллов включите план выполнения с дополнительным union all и без него.   -  person Andrew Sayer    schedule 28.10.2020


Ответы (2)


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

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

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

Неизвестно, имеет ли это значение для вашего фактического сценария.

person Andrew Sayer    schedule 28.10.2020
comment
спасибо, что он работает и работает намного лучше, как и ожидалось - person Symonds; 28.10.2020
comment
теперь мы знаем, что производительность улучшается с изменениями sql ... все же вы видите какие-либо другие варианты, где мы можем попробовать альтернативу этому представлению для повышения производительности или могут быть изменения sql? Затем я могу это проверить ... - person Symonds; 28.10.2020
comment
Если вы не предоставите дополнительную информацию, я буду просто колоть в темноте, я использую свой хрустальный шар только один раз в день на человека. Нам нужен полный SQL, который вы выполняете, и соответствующие определения представлений, и полный план выполнения. - person Andrew Sayer; 28.10.2020

вы можете попробовать НЕ СУЩЕСТВУЕТ и посмотреть, поможет ли это

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
)
person hkandpal    schedule 28.10.2020