14
Sep/08
2

Performance avec les procédures stockées

Les procédures stockées ont fait leur apparition avec MySQL 5.0. Une procédure stockée est un ensemble de plusieurs requêtes basées sur le standard sql:2003, regroupées ensemble et stockées dans la base de données. On leur attribut plusieurs avantages, notamment:

  • Elles réduisent le trafic réseau: on peut exécuter plusieurs requêtes avec un seul échange entre le client et le serveur.
  • Elles offrent un contrôle de sécurité: un user peut exécuter une procédure qui fait des requêtes sur une ou des tables auxquelles il n’a pas accès. Ces requêtes peuvent être en lecture ou en écriture.
  • Elles assurent le respect de logiques particulières ou d’intégrité.

J’avais un cas où une application devait faire très régulièrement (jusqu’à plusieurs fois par secondes) les 4 mêmes requêtes: SELECT.. UPDATE.. SELECT.. UPDATE. En déplaçant ces 4 requêtes dans une procédure stockée, j’ai sauvé 3 échanges entre le client et le serveur, quelques boucles dans le code et l’instanciation de quelques objets PHP. Au total, le même processus est devenu 46% plus rapide.

L’utilisation de procédure n’est pas sans risque. En effet, la souplesse de MySQL peut rendre la création et l’exécution d’une procédure valide, alors qu’elle ne le devrait pas. C’est pourquoi il est recommandé de créer la procédure en strict mode. Ainsi, vous serez averti si une de vos opérations repose sur un comportement variable.

Il y a plusieurs niveaux de sécurité reliés aux procédures. Tout d’abord, MySQL 5.0 possède de nouveaux privilèges permettant à un utilisateur de:

  1. Créer des routines*
  2. Modifier des routines
  3. Exécuter des routines

*Les procédures stockées, les fonctions et les “triggers” sont inclus dans la définition d’une routine.

Il est généralement déconseillé de permettre aux utilisateurs de créer ou modifier des routines. Puisqu’elles sont exécutées sur le serveur, il est possible de faire planter tout le système si un utilisateur crée accidentellement une boucle infinie. Ces privilèges devraient être réservés à un DBA ou à un utilisateur expérimenté en qui vous avez confiance.

De plus, l’exécution d’une procédure doit obéir aux privilèges du definer ou de l’invoker. Lors de sa création, il est possible d’indiquer si l’exécution de chaque statement doit respecter les privilèges du créateur ou de l’exécuteur. Le défaut est definer, ce qui peut être potentiellement dangereux si la procédure est créée en étant root. À l’inverse, ça peut être très pratique pour permettre de lire ou écrire de manière restreinte dans une table dans laquelle un utilisateur n’a pas forcement accès.

Les procédures possèdent un tas d’avantages: rapidité, sécurité et consistance. On peut même les utiliser pour réduire des erreurs liées aux transactions (locktimeout, deadlock, etc..) et prévenir les injections SQL. Elles possèdent cependant des désavantages: les requêtes exécutées ne peuvent être cachées. Puisqu’elle sont préalablement parsées et stockées sur le serveur, il n’est pas possible de faire appel au mécanisme de caching lors de leur exécution. C’est un aspect à considérer lors d’optimisation d’un processus.

En conclusion, lorsqu’elles sont correctement utilisées, les procédures stockées peuvent ajouter beaucoup de rapidité à un processus. Plusieurs programmeurs qui n’ont jamais utilisé d’autre SGBD que MySQL ne sont peut-être pas familliers avec les procédures. Je recommande à tous de prendre un instant pour y jeter un coup d’oeil !

Comments (2) Trackbacks (0)
  1. Berceker
    5:10 am on September 15th, 2008

    Bonjour,
    Je confirme parfaitement les dires de cette articles. A titre personnel j’ai dû développez une application dont les sources était à Singapour et la base de données en Asie. En développant à l’ancienne, le parse d’une page PHP faisant plusieurs allé retour entre Berlin et Singapour. Les procédures stockées ont répondu à mon problème et a amélioré grandement le problème. Certe, c’est pas comme du T-SQL avec SQLServer car il manque beaucoup de fonctionnalité et un manque cruel d’une gestion des erreurs digne de se nom. Mais ne désespérons pas, je pense que cela viendra à dans l’avenir.

  2. PaT
    9:23 pm on September 15th, 2008

    Effectivement, la gestion des erreurs est assez primitive. Quelques fonctionnalités du standard SQL:2003 ne sont pas encore implémentées, notamment la possibilité de déclencher nos propres erreurs en utilisant le statement SIGNAL. Je n’ai rien vu dans le roadmap de MySQL 5.1, 5.2 et 6.0 à cet effet. Il existe des moyens de simuler des erreurs personnalisés, mais ces techniques ne sont pas très.. “propre”.

Leave a comment

No trackbacks yet.