2012-06-11 13 views
7

tengo una consulta SQL con la siguiente estructura:Optimización de una llamada de función almacenada en las cláusulas SELECT y WHERE

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

¿Hay una manera de optimizar esta eliminación de varias llamadas de función? ¿O MySQL realiza esa optimización detrás de la escena? De hecho, la función se declara como determinista.

También necesito mencionar que los parámetros de la función son parcialmente de las columnas de la tabla seleccionada. Cambié el ejemplo ligeramente para reflejar esto.

+0

'Es un param' columna en la tabla o un parámetro? –

Respuesta

7

reescritura y la prueba de cuál funciona más rápido:

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 ; 

En MySQL, incluso se puede escribir como este (advertencia: no estándar SQL sintaxis):

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

Extrañamente, probé el último pero MySQL mostró un error. Lo intentaré de nuevo. – Stan

+0

¿Puedes publicar exactamente lo que probaste? ¿Y cuál fue el mensaje de error? –

+0

De hecho, probé f en la cláusula 'where', no en' having', es por eso que produjo el error. De todos modos, ¿cumple MySQL la optimización automáticamente, debido a la declaración de la función 'determinista'? – Stan

Cuestiones relacionadas