Хорошая часть использования Oracle - это знание того, что «должно» произойти, а что нет.
Добавление условия RETURNING INTO
не «подразумевает» замедление работы вашего обновления.Когда происходит что-то, чего не должно быть, зайдите на сайт поддержки Oracle, чтобы узнать, является ли это известной ошибкой.
В вашем случае похоже, что вы столкнулись с:
Ошибка 27131648 - ПОД ОПТИМАЛЬНЫЙ ПЛАН ОБ ОБНОВЛЕНИИ ОБНОВЛЕНИЯ С ВОЗВРАТОМ В
Я не уверен, есть ли патч, но есть простой обходной путь: используйте подсказку UNNEST
.В вашем случае это будет:
UPDATE
update_table
SET
prop1 = 3, prop2 = NULL
WHERE EXISTS (
SELECT /*+ UNNEST */ null FROM update_table f
INNER JOIN rel_table1 u ON f.ID= u.ID
INNER JOIN rel_table2 VP ON f.another_ID = VP.another_ID
WHERE (u.prop1 = 3)
AND VP.prop1 = 1
AND (u.prop2 = 75)
AND f.ID = update_table.ID
)
ReTURNING ID BULK COLLECT INTO idCol;