IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Pb lenteur dans mes fonctions stockées


Sujet :

SQL Procédural MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Pb lenteur dans mes fonctions stockées
    Bonjour à tous,

    Je vous écris à cause d’un problème de lenteur qui me fait tourner en bourrique.
    Je vous plante le décor. Je dispose de deux serveurs, un de dév et un de prod. Ces deux serveurs tournent tous les deux sur des linux ubuntu 7.04 (noyau 2.6.20 d'un coté et 2.6.18 de l'autre). Sur ces machines sont installés les mêmes mysql (5.0.38-Ubuntu_0ubuntu1-log). Ces mysql ont des configurations strictement identiques (excepté le langage french d’un coté et english de l’autre). J’ai fait un dump de la machine de dév vers la machine de prod et tout semblait fonctionner pour le mieux. Seulement je me suis rendu compte que certaines requêtes étaient étrangement longues sur la machine de prod par rapport à la machine de dév (qui est légèrement moins puissante). Après analyse je me suis rendu compte que ces lenteurs étaient dues à l’utilisation des mes fonctions stockées. Je les ai donc réanalysée. J’ai repris chacun des curseurs présents à l’intérieur et ai contrôlé que tous les index étaient bien présents pour que les SQL tournent au plus vite.
    Tout semble ok mais malgré tout mes fonctions continuent de plomber mes perfs. L’impact est flagrant. C’est de l’ordre de qq centièmes d’un coté à 10 secondes de l’autre.

    Est-ce que qqun aurait une idée ? Je suis preneur de toutes informations me permettant d’avancer.

    Merci d’avance,

    T.

  2. #2
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    es tu sur que les indexs sont bien utilisés ? en faisant un explain des procedures penalisantes, tu peux verifier.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Je ne suis pas sûr qu’on puisse faire un explain sur une fonction.
    Par contre ce que je peux te garantir c’est que les index existent bien.

    Un exemple flagrant, cette fonction :

    DROP FUNCTION IF EXISTS `fct_nomcli` $$
    CREATE DEFINER=`root`@`localhost` FUNCTION `fct_nomcli`(p_sigtie varchar(16)) RETURNS varchar(50) CHARSET latin1
    DETERMINISTIC
    BEGIN
    declare v_nomcli varchar(50);
    select nomtie into v_nomcli from w_tie force index (PRIMARY) where sigtie=p_sigtie;
    return v_nomcli;
    END $$

    DELIMITER ;

    Nous l’avons compilé avec et sans le « force index (PRIMARY) » (trouvé sur une page web).

    Si nous appelons cette requête qui ramène une 40ene de lignes, nous arrivons à obtenir le résultat en qq centièmes sur la machine de dév alors qu’il faut 19s pour la machine de prod.

    select fct_nomcli(sigtie) from w_tie where sigtie like '505910%';

    Nous utilisons pourtant la clé primaire de la table !
    Si maintenant nous exécutons la requête suivante (qui ramène le même résultat sans utiliser de fonction) :
    select nomtie from w_tie where sigtie like '505910%';
    nous obtenons le résultat en qq millième quelque soit la machine.

    Tout me laisse penser que le mysql de la machine de prod n'utilise pas les indexs dans les fonctions.

    :°-(

  4. #4
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    essaye de faire ceci sur ton serveur de prod et de dev:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXPLAIN  select nomtie into v_nomcli from w_tie where sigtie=p_sigtie;
    verifie bien que tu as un index sur la colonne sigtie et regarde le delta entre les deux explain.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour !

    J'interviens pour remplacer mon pote qui vient de nous quitter pour rentrer à la maison !

    j'ai lancé ça sur les 2 serveurs :

    EXPLAIN SELECT nomtie FROM w_tie WHERE sigtie='50591010';

    Des 2 cotés, j'obtiens la même réponse, à savoir :

    +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+
    | 1 | SIMPLE | w_tie | const | PRIMARY | PRIMARY | 14 | const | 1 | |
    +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+

    C'est vraiment désespérant...

  6. #6
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    essaye avec le like '505910%' mais je vois pas trop pourquoi ça met plus de temps sur le serveur de prod.

    normalement les index sont declenchés avec un like qui n'a pas le caractere joker au debut donc dans ce cas ça doit declencher.

    Si les explain sont exactement les memes , que tu utilises les memes scripts de creation de table, d'index et de contrainte alors les temps devraient etre identique.

    Si c'est pas le cas ça ne vient peut etre pas de mysql mais de l'utilisation memoire ou autre chose. mais la encore si la config est identique c'est bizarre

    si quelqu'un a des suggestion, je serai curieux de comprendre tout ça.

    courage



    PS: en y pensant ça vient peut etre du cache.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    re !

    Très étrange :
    quand j'examine le fichier mysql-slow.log, je vois :
    Query_time: 22 Lock_time: 0 Rows_sent: 41 Rows_examined: 10317240

    j'ai 251639 clients dans ma base.

    or 251639 *41 = 10317240

    ça signifie que à chaque client selectionné, il fait un full scan de la table...

    du coup, j'ai fait un nouveau test :

    SELECT fct_nomcli(sigtie) FROM w_tie WHERE sigtie in (select sigtie from w_tie where sigtie like '505910%');

    C'est pas beau, hein ! Mais ça marche beacoup mieux, ce qui confirme l'hypothèse que MYSQL évalue la valeur de la fonction avant même de lire le WHERE...
    Super....

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Résolu
    Je viens de trouver.
    C'était une histoire de character-set différents dans la conf du serveur de prod. Je pense qu'à un moment mysql savait que le curseur comparait des valeurs encodées différemment. Du coup l'utilisation de l'index n'était certainement plus possible.

    Voici les lignes de conf commentées
    #character-set-server=utf8
    #skip-character-set-client-handshake

    Ensuite j'ai droppé ma base et j'ai relancé un import à partir d'un dump de ma machine de dev.

    Et ça marche !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupération de données dans mes fonctions
    Par sinifer dans le forum Langage
    Réponses: 12
    Dernier message: 09/07/2009, 10h35
  2. [PHP 5.2] Probleme de variable dans mes fonctions
    Par dudux2 dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2009, 22h57
  3. Réponses: 10
    Dernier message: 21/09/2006, 19h18
  4. Réponses: 14
    Dernier message: 05/09/2006, 01h17
  5. Mettre mes fonctions dans un meme script
    Par sparrow dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2006, 01h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo