Bonjour
J'ai le problème suivant. J'ai besoin de faire une requete un peu sophistiquée et il se trouve que si je l'écris d'un seul bloc elle est tuée par l'hébergeur parce qu'elle consomme trop de ressource (en plus d'être trop longue pour une utilisation web). Si je la divise en deux, tout va mieux, j'ai moins de calculs redondants parce que j'utilise plusieurs fois les données précalculées.
J'avais envie de me tourner vers les tables temporaires, celle-ci me semblait une solution parfaite sauf qu'une table temporaire présente l'inconvénient( du moins avec MyIsam ) de ne pas pouvoir être manipulée comme une table permanente (message d'erreur: can not re-open temporary table ) qui est un bug/feature connu et débatu dans la doc officielle.
Donc j'ai besoin d'une solution de contournement. J'aimerai savoir s'il existe une façon recommandée de le faire, j'ai rien trouvé dans la faq.
Maintenant la solution que j'ai trouvée que je vous demande de critiquer:
- création d'une table permanente vide, avec le moteur InnoDB (important pour la transaction)
- démarrage d'une transaction
- insertion dans la table d'usage temporaire des données précalculées
- ma grosse requête qui lit les données de la table d'usage temporaire
- rollback (j'ai pas besoin de conserver ses données dans la base, so... )
une mise à jour différentielle de la table me parait plus difficile à scripter.
j'ai un inconvénient, c'est que dans certain cas, j'ai un problème de verrou non libéré si le script s'interrompt avant la fin du script, ce que je gère via l'exception retournée, même si ça ne marche pas si bien que ça.
Partager