Bonjour à vous,

Je m'interroge sur une chose concernant la vitesse d'exécution dans le cas où on utilise des fonctions par rapport à si on ne les utilisait pas. Par exemple, imaginez que je fasse une fonction dont le but serait de retourner une valeur nommée "get_info_table2" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
BEGIN
DECLARE result VARCHAR(64);
set result = "";
     SELECT table2.type
     INTO result
     FROM table2 
     WHERE table2.id=_id
     ORDER BY table2.timestamp DESC LIMIT 1;
RETURN result;
END
Maintenant, j'aimerais savoir si faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
SELECT table.id, table.nom, get_info_table2(table.id) as info
FROM table
WHERE *
serait plus rapide, plus lent, ou équivalent à
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
SELECT table.id, table.nom, 
(SELECT table2.type
     INTO result
     FROM table2 
     WHERE table2.id=table.id
     ORDER BY table2.timestamp DESC LIMIT 1) as info
FROM table
WHERE *
Bon je sais qu'en l'occurence, l'exemple est un peu con et qu'il serait sans doute plus élégant de faire une jointure mais c'est la vitesse d'exécution d'une fonction que j'aimerais discuter ici... En d'autres termes, ma question est : "créer une fonction et utiliser son nom dans une requête est-il plus rapide que de mettre le code de la fonction directement dans la requête qui l'utilise ??"

L'avantage que je vois à créer une fonction est que la "maintenance" est plus facile : si ce bloc est utilisé dans plusieurs requêtes et qu'il doit être modifié par la suite, il me suffira de le modifier une seule fois (dans la déclaration de fonction) pour que le changement se répercute partout bien sûr... Mais si c'est calamiteux en terme de performances, ce n'est peut-être pas idéal non plus...

Merci pour vos retours d'expérience(s) et vos avis ! :-)

RL