Проблема в том, что я вынужден использовать View вместо Table (это первый случай в списке ниже).1. Я запускаю запрос в представлении с функцией в предложении «Где» как пользователь, который не является владельцем этих объектов (представление и функция):
select count(*) from VW_BOOK b where contains(b.title, fn_textconverter('Eden'), 1) > 0;
или
select count(*) from VW_BOOK b where contains(b.title, (select fn_textconverter('Eden') from dual), 1) > 0;
Таким образом, приведенные выше запросы выполняются очень медленно, поскольку оптимизатор Oracle игнорирует индексы в таблице и помещает предикаты в представление.2. Когда я выполняю тот же запрос, но вместо использования View я использую Table, он выполняется очень быстро и применяет индексы, созданные для таблицы:
select count(*) from TB_BOOK b where contains(b.title, fn_textconverter('Eden'), 1) > 0;
3. Тот же хороший результат, который я вижу для запроса, когда использую View, но вместо функции я помещаю результат функции без вызова самой функции:
select count(*) from VW_BOOK b where contains(b.title, '\E\d\e\n%', 1) > 0;
Когда я пытаюсь установить optimizer_secure_view_merging в False или предоставить моему пользователю привилегию MERGE VIEW, 1-й случай из приведенного выше списка выполняется очень быстро, пропуская предикаты push в View.Поскольку я не могу добавить дополнительные привилегии пользователю из-за политики и не могу также изменить параметры Oracle, возникают вопросы:
Можно ли заставить Oracle объединять определенные пользователем представления и функции независимо от того, задал ли я параметр optimizer_secure_view_merging как TRUE и не имею привилегии MERGE VIEW? Может быть, есть способы установить или воссоздать функцию как «Защищенную», чтобы Oracle смело мог объединить ее с моим View?