Mysql-запрос с пользовательской функцией - почему функция была вызвана дважды?

0

У меня есть соотношение 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. Я мог бы исправить это, добавив детерминированный заголовок функции, но я думал, что каждая функция/хранимая процедура, обращающаяся к данным таблиц, не является детерминированной.

Какое правильное решение для этой проблемы?

Теги:
optimization
user-defined-functions
deterministic

1 ответ

0

Вы можете использовать временную таблицу для хранения результатов FROM Entity WHERE fn_match(i) - но это, вероятно, не улучшит производительность. Если это портит производительность при вызове fn_match дважды, похоже, что производительность будет не так уж велика, если бы она была вызвана только один раз для каждого элемента в Entity - поэтому, вероятно, лучше вообще переосмыслить эту функцию.

  • 0
    Я согласен, что функция вызова для каждой записи не подходит для производительности. Я не могу объяснить все детали, но я действительно был вынужден реализовать этот способ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню