2014-10-08 6 views
0

У меня есть этот простой UPDATE заявление:Oracle Update на View экстремально медленно

UPDATE v_my_view mv 
    SET mv.name = 
       (SELECT RTRIM(name) 
       FROM v_another_view av 
       WHERE av.KEY_ID = mv.KEY_ID) 
    WHERE mv.VALID = 1; 

Это заявление занимает очень долго (20 секунд), в то время как другие, более сложные обновления на ту же точку зрения занимает менее 1 секунды. Сначала я подумал, что это функция RTRIM, но это не так, если я не использую ее, она медленная, как раньше.

SELECTs в обоих представлениях возвращают записи очень быстро.

Существует нет TRIGGER на вид, но есть один на столе позади. Но это не может быть узким местом, поскольку даже когда я прокомментирую весь код TRIGGER, он имеет такую ​​же медленную производительность.

У кого-нибудь есть предложение?

EDIT: добавлено отсутствующее предложение WHERE EDIT: представление (или таблица позади) содержит только 8000 записей, не имеющих специальных типов данных.

+0

Как определяются виды? т.е. DDL как v_my_view, так и v_another_view – toddlermenot

+1

Каков план выполнения? –

+0

@toddlermenot: Представления очень просто выбирают только по одной таблице позади. – flo

ответ

0

Вы обновляете весь вид без предложения WHERE.

Если у вас большой объем данных или даже индексы, это может замедлить вашу работу.

+0

Извините, я забыл добавить предложение WHERE в свой пост, сделаю это сейчас. Во всяком случае, полное количество записей - прим. 8000 ... так довольно низко, я думаю, и не может быть бутылочкой. – flo

+0

Как насчет индексов? –

0

У вас есть показатели по столбцу name в базовой таблице v_my_view? Если да, отключите их и посмотрите, приведет ли это к каким-либо улучшениям в производительности запроса. Как замечает Nick.McDermaid, трудно сказать без планов выполнения и статистики событий ожидания. Лучшее, на что вы можете надеяться, это некоторая форма психической отладки.

0
merge --+ use_hash(MV,AV) no_merge(AV) no_merge(MV) 
    into (select * from v_my_view MV where valid = 1) 
using v_another_view AV 
on MV.key_id = AV.key_id 
when matched then 
    update 
    set MV.name = rtrim(AV.name) 
; 

Хотя я не совсем уверен, что merge ать в вложенное представление, но вы можете попробовать его, по крайней мере (и оставить комментарий, если он не работает).

Также рекомендуется продемонстрировать планы выполнения ваших запросов вместе с запросами.

Смежные вопросы