#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
)