Вызов хранимых функций в запросе SELECT СУБД MySQL

Сегодня на работе столкнулся с таким вопросом: при запросе SELECT, где в качестве одного или нескольких полей данных вызывается пользовательская хранимая функция, будет ли эта функция вызываться для записей, подходящих под запрос, но не вошедших в LIMIT?

Т.е., например такой запрос:

SELECT id, my_code(code) FROM table1 LIMIT 0, 10; /* сколько раз выполниться функция my_code, если записей в таблице 20? */

Конечно, логично предположить, что оптимизатор заметит, что вызов функции не имеет смысла для строк, которые не выдаются клиенту. Но ведь функция может содержать SQL-команды, вносящие изменения в базу (например, добавлять запись в таблицу code_log при каждом вызове функции my_code() ). Т.е. все же некоторый смысл в этом найти можно. Как же реализовали этот момент разработчики? Я склонялся к варианту, что вызов будет только для возвращаемых строк.

Решил проверить на практике. Использовал пример с insert’ом внутри хранимой функции. И предположения подтвердились. Функция вызывается ровно столько раз, сколько строк в передается клиенту. В примере выше функция будет вызвана 10 раз.

Об авторе Валера Леонтьев

Программист PHP/MySQL.

Запись опубликована в рубрике MySQL, Все рубрики с метками . Добавьте в закладки постоянную ссылку.

Один комментарий на «Вызов хранимых функций в запросе SELECT СУБД MySQL»

  1. Дмитрий говорит:

    Тут-то как раз все однозначно. А если вызов функции будет происходить из секции WHERE, то она будет выполнятся для всей записей таблицы :)

Обсуждение закрыто.