Оптимизация вызова хранимой функции в предложениях SELECT и WHERE

У меня есть запрос SQL со следующей структурой:

SELECT *, storedfunc(param, table.field) as f 
FROM table 
WHERE storedfunc(param, table.field) < value 
ORDER BY storedfunc(param, table.field);

Есть ли способ оптимизировать это, устраняя несколько вызовов функций? Или MySQL выполняет такую оптимизацию за сценой? На самом деле функция объявлена как детерминированная.

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

 ypercubeᵀᴹ11 июн. 2012 г., 11:54
Являетсяparam столбец в таблице или параметр?

Ответы на вопрос(1)

Решение Вопроса

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
WHERE storedfunc(param, table.column) < value 
ORDER BY f ;

SELECT *
FROM
  ( SELECT *, storedfunc(param, table.column) AS f 
    FROM table 
  ) AS tmp
WHERE f < value 
ORDER BY f ;

В MySQL вы даже можете написать так (warning: not standard SQL синтаксис):

SELECT *, storedfunc(param, table.column) AS f 
FROM table 
HAVING f < value 
ORDER BY f ;
 Stan11 июн. 2012 г., 11:56
Странно, я попробовал позже, но MySQL показал ошибку. Попробую еще раз.
 Stan11 июн. 2012 г., 12:09
На самом деле я пытался найтиwhere оговорка, а не вhavingВот почему он выдал ошибку. В любом случае, MySQL выполняет оптимизацию автоматически из-заdeterministic объявление функции?
 11 июн. 2012 г., 12:15
Не уверен, придется проверить это. И это, вероятно, зависит от версии MySQL. Более новые версии имеют больше шансов выполнить оптимизацию.
 11 июн. 2012 г., 12:00
Можете ли вы опубликовать именно то, что вы пытались? А что за сообщение об ошибке было?

Ваш ответ на вопрос