2009-10-16 8 views
1

Je viens de convertir une instruction SQL select dans une procédureMysql - La procédure stockée ne pas utiliser le cache de requêtes

stockées L'instruction SQL utilisation instruction select prend 0.4784s pour exécuter la première fois et 0.0003s après

La procédure stockée prend 0.4784s à exécuter à chaque fois.

Je suppose que le cache de requête n'est pas été utilisée

Comment puis-je remédier à cette situation?

Une version simplifiée du code

SELECT * FROM Venues WHERE VenueName = :TheVenue 

=======

CREATE PROCEDURE GetVenues 
(
    TheVenue VarChar(22) 
) 
BEGIN 
    SELECT * FROM Venues WHERE VenueName = TheVenue 
END; 

Répondre

2

Bienvenue dans MySQL ... il est vraiment difficile d'obtenir quoi que ce soit dans une procédure stockée pour tirer parti du cache de requêtes. L'article de développement A Practical Look at the MySQL Query Cache en parle en détail. Les limitations sont également mentionnées dans la documentation de référence here et sur le MySQL Performance Blog. Fondamentalement, ne dépendent pas de la mise en cache des requêtes exécutées à l'intérieur des procédures stockées. Il est presque impossible de le faire fonctionner bien que the first reference affirme que c'est possible. Ce n'est généralement pas un problème si vous utilisez des procédures stockées pour encapsuler une logique compliquée. La plupart des problèmes que j'ai vus ont été provoqués en utilisant des procédures stockées pour des requêtes très simples où un VIEW aurait suffi.

2

Vous pouvez essayer une procédure stockée SQL dynamique, comme:

CREATE PROCEDURE GetVenues (TheVenue varchar(22)) 
BEGIN 
SET @s = 'SELECT * FROM Venues WHERE VenueName = ?'; 
SET @v = TheVenue; 
PREPARE stmt1 FROM @s; 
EXECUTE stmt1 USING @v; 
DEALLOCATE PREPARE stmt1; 
END; 

Non MySQL à la main pour tester la syntaxe, donc vous devrez peut-être le modifier.

Questions connexes