У меня есть соотношение 1:1 между таблицами Entity и Contact (что соответствует наследованию объекта). fn_match (id) - это UDF, который возвращает логическое значение и возвращает true, если запись соответствует некоторым специальным критериям (дополнительные запросы внутри функции). Это запрос:
select *
from Entity a
inner join Contact b on a.id = b.id
where fn_match(a.i)
Он работал нормально, но резко увеличил производительность. Я добавил регистрацию и обнаружил, что fn_match вызывается дважды для каждой записи в Entity с fn_match (id) = true. Я мог бы исправить это, добавив детерминированный заголовок функции, но я думал, что каждая функция/хранимая процедура, обращающаяся к данным таблиц, не является детерминированной.
Какое правильное решение для этой проблемы?
Вы можете использовать временную таблицу для хранения результатов FROM Entity WHERE fn_match(i)
- но это, вероятно, не улучшит производительность. Если это портит производительность при вызове fn_match дважды, похоже, что производительность будет не так уж велика, если бы она была вызвана только один раз для каждого элемента в Entity - поэтому, вероятно, лучше вообще переосмыслить эту функцию.