Oracle WITH - принудительно выполнять неиспользуемый оператор (отключить оптимизацию) - PullRequest
0 голосов
/ 23 января 2019

Проблема: БД Oracle использует некоторую оптимизацию и не выполняет компонент WITH, который не используется в конечном запросе. Так что нет выполнения неиспользованных запросов.

Вопрос:

Можно ли отключить оптимизацию Oracle и выполнить все запросы в предложении WITH? Есть ли какие-то особые намеки на это?

Подробности:

Я хочу использовать Oracle Database Context механизм внутри моих запросов, выполняемых из Java-программы. Я решил использовать Database session-based application context initialized locally тип контекста. Поэтому в одном сеансе базы данных я могу установить некоторые переменные контекста, и только в этом сеансе он будет виден.

У меня есть идея выполнить функцию (которая устанавливает необходимые переменные контекста) непосредственно перед реальным запросом SQL. Таким образом, лучшее место будет связывать обе вещи вместе. Это был бы лучший вариант для меня.

Минимальный пример:

Если мы выполним (или посмотрим на план объяснения) этот запрос, мы заметим, что подзапрос EXEC_CTX НЕ выполнен. Только последний запрос из real_table фактически выполняется Oracle. Можем ли мы каким-то образом заставить Oracle выполнить их оба (целый WITH запрос)?

WITH EXEC_CTX AS (
  select set_my_ctx(42) from dual
)
SELECT *
  FROM real_table rt
 WHERE rt.col_x = SYS_CONTEXT('CTX_NAME', 'PARAM_ID')
;

Я использую базу данных Oracle 12c.

...