Le nombre d'étapes ne dicte pas la performance !
Je n'ai pas dit que sa méthode était bonne et la vôtre mauvaise.
Moi non plus, je ne suis pas convaincue que cette histoire de table temporaire est une bonne chose. C'est un parti pris qu'il faut remettre en question
Oui, une sous-sous-requête peut être très performante si elle est optimisée mais cela suppose aussi que les tables soient indexées comme il faut, que les jointures se fassent de façon idéale etc. Je n'ai pas l'impression qu'on est dans ce cas de figure. Je pense donc que votre solution pourrait potentiellement être encore pire dans son cas de figure, compte tenu de la structure de ses tables. Sur un jeu de données conséquent, je soupçonne que le coût peut au contraire être exponentiel.
Ca se comprend: faire des subselect imbriqués sur des tables gigantesques non indexées, ou sans pouvoir exploiter les index présents, ça revient à faire un full table scan et le coût devient réellement prohibitif quand le nombre d'enregistrements est important.
Si vous pensez le contraire, alors testez de votre côté, injectez quelques dizaines de milliers d'enregistrements pour commencer, et tirez votre propre plan d'exécution pour démontrer que a) les tables sont judicieusement indexées, b) tous les index présents sont utilisés de manière optimale par cette requête et c) un accroissement même important du nombre d'enregistrements n'a pas d'impact significatif sur les performances.
Je l'ai dit plus haut:
- apprendre à tirer un plan d'exécution, pour comprendre où se situe le goulet d'étranglement et quelle est la partie qu'il faut tenter d'améliorer. Si on veut améliorer les performances on doit apprendre à mesurer le coût de ce qu'on fait et c'est pareil en programmation
- j'ai suggéré un outil relativement accessible pour commencer
- et je recommande de lire les bases pour bien comprendre le principe: https://dev.mysql.com/doc/refman/8.0...formation.html
- moi-même je ne suis pas spécialiste mais je sais un peu ce qu'il faut chercher et c'est déjà le début de la solution
- et si vraiment il insiste pour faire des tables temporaires, mais qu'il pense que la gestion des tables temporaires est mauvaise en Mysql (ce que suggère @SQLpro par ailleurs), alors qu'il essaie avec des tables ordinaires. Pourquoi ne pas tester juste pour la valeur éducative et éliminer une hypothèse au passage (même si encore une fois je doute du bien-fondé de la démarche...). En tout cas, il n'est pas interdit d'expérimenter et c'est comme ça qu'on apprend
- envisager de saucissonner le processus - est-il vraiment nécessaire de traiter l'entièreté de la table en une passe ?
Il ne faut pas hésiter à tester différents scenarios, et la solution qui paraît la plus intuitive ne sera pas forcément la meilleure.
Que cherche-t-on à prouver ici ? Tant qu'on y est on peut prendre un serveur avec 16 processeurs et 100 Gb de RAM et charger la DB en mémoire mais il faut bien comprendre que c'est une fuite en avant et un gaspillage de ressources. Ce n'est pas le matériel qu'il faut changer mais la manière de penser.
Là où je vous rejoins, c'est sur la lisibilité du code. Je pense que si le code est difficilement lisible pour un humain c'est souvent pareil pour l'ordinateur, où dans le cas présent, le query optimizer ou whatever ça s'appelle en Mysql.
Encore une fois, il faut réfléchir à la structure des tables, le volume que l'on traite, et aussi prendre en compte certains facteurs périphériques comme le transaction log. Si vous mettez à jour un gros volume de données mais que cela doit se faire en une transaction atomique, ça peut impliquer l'écriture d'un gros paquet de données dans ce transaction log, jusqu'au commit final. Des gigas de données peut-être. Le serveur fait ce qu'on lui demande de faire mais ça ne veut pas dire qu'il ne souffre pas.