Сегодня на работе столкнулся с таким вопросом: при запросе SELECT, где в качестве одного или нескольких полей данных вызывается пользовательская хранимая функция, будет ли эта функция вызываться для записей, подходящих под запрос, но не вошедших в LIMIT?
Т.е., например такой запрос:
SELECT id, my_code(code) FROM table1 LIMIT 0, 10; /* сколько раз выполниться функция my_code, если записей в таблице 20? */
Конечно, логично предположить, что оптимизатор заметит, что вызов функции не имеет смысла для строк, которые не выдаются клиенту. Но ведь функция может содержать SQL-команды, вносящие изменения в базу (например, добавлять запись в таблицу code_log при каждом вызове функции my_code() ). Т.е. все же некоторый смысл в этом найти можно. Как же реализовали этот момент разработчики? Я склонялся к варианту, что вызов будет только для возвращаемых строк.
Решил проверить на практике. Использовал пример с insert’ом внутри хранимой функции. И предположения подтвердились. Функция вызывается ровно столько раз, сколько строк в передается клиенту. В примере выше функция будет вызвана 10 раз.
Тут-то как раз все однозначно. А если вызов функции будет происходить из секции WHERE, то она будет выполнятся для всей записей таблицы :)