2012-06-11 12 views
7

ho una query SQL con la seguente struttura:Ottimizzare una chiamata di funzione memorizzata in clausole SELECT e WHERE

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

Esiste un modo per ottimizzare questo eliminando diverse chiamate di funzione? Oppure MySQL esegue questa ottimizzazione dietro le quinte? In effetti la funzione è dichiarata come deterministica.

Ho anche bisogno di ricordare che i parametri della funzione sono parzialmente dalle colonne della tabella selezionata. Ho cambiato leggermente l'esempio per riflettere questo.

+0

è 'param' un colonna nella tabella o un parametro? –

risposta

7

Rewrite e testare quale funziona più veloce:

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 ; 

In MySQL, si può anche scrivere come questo (avvertimento: non standard SQL sintassi):

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

Stranamente, ho provato più tardi, ma MySQL ha mostrato un errore. Ci riproverò. – Stan

+0

Puoi pubblicare esattamente ciò che hai provato? E quale era il messaggio di errore? –

+0

Infatti, ho provato f nella clausola 'where', non in' having', questo è il motivo per cui ha prodotto l'errore. In ogni caso, MySQL esegue automaticamente l'ottimizzazione a causa della dichiarazione di funzione 'deterministica'? – Stan

Problemi correlati