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

PostgreSQL Discussion :

Aide temps de réponse requete


Sujet :

PostgreSQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Par défaut Aide temps de réponse requete
    Bonjour;

    J'ai un gros problème avec une requête .

    Cette requête a des temps d'exécution tout fait acceptable de l'ordre 0,08 sec et tout d'un coup la même requête va s'emballer et prendre 4 voir 25 sec pour s'exécuter alors que le contenu de la table n'a pas changé.

    Merci pour vos pistes car je sèche...

    Bien à vous !

  2. #2
    Membre Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Par défaut
    Y a-t-il eu récemment un ajoût de volumétrie sur une des tables de la requêtes ?
    Les stats sont-elles à jour pour toutes les tables concernées par la requête ?
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Par défaut
    Il y avait 10 000 enregistrements dans cette table.. maintenant il y en a une centaine.

    J'ai fait un vacuum...

    C'est une table qui contient les membres en ligne, donc constamment mise à jour.

    la requête peut être très très rapide pendant 20 minutes et tout à coup avec le même nombre d'inscrits quasiment... mettre jusqu'à 30 secondes d'exécution alors que la table contient seulement 100 inscrits en ligne. Cela dure quelques minutes et ensuite tout redevient normal...

    J'ai retourné ma requête dans tous les sens je ne vois pas le problème sql, d'autant plus que les temps de réponse sont très bon la plupart du temps...

    je ne sais pas quoi faire...

    Merci

  4. #4
    Membre Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Par défaut
    La commande 'vacuum' seule ne calcule pas les stats.
    Que donne la vue pg_stats filtrée sur ta table ?
    As-tu essayé 'vacuum full analyze ta_table' pour réellement recalculer les stats sur ta table depuis la diminution de volumétrie ?
    Peux-tu donner ta requête et le plan d'exécution de ta requête (explain select ...) ?
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Par défaut
    J'ai fait un vacuum full analyze sur ma table.

    ma page est composée de deux requêtes : la première calcul le nombre de inscrits en ligne dans la table et la seconde les affiche.

    J'ai mis dans ma page PHP pour chaque requete une indication du temps d'exécution de chaque requête.

    le problème se pose en premier avec la requête qui calcule le nombre d'inscrits en ligne. Tout d'un coup, on ne sait pas pourquoi, elle va mettre 5 secondes pour analyser une table qui fait 100 lignes.

    Ensuite ça s'enchaine avec la deuxième requête qui prend aussi du temps. Le tout s'accumule et le temps d'exécution devient énorme.

    J'ai fait un explain de ma requête mais cette explain a été fait alors que le temps de réponse est correct.

    C'est tellement aléatoire que j'arrive pas à obtenir l'explain quand il y a un pb.

    puis-je t'envoyer la requete qui calcule le nombre de membre en ligne en privé ?

  6. #6
    Membre Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Par défaut
    Citation Envoyé par viny Voir le message
    J'ai fait un explain de ma requête mais cette explain a été fait alors que le temps de réponse est correct.
    Ce n'est pas depuis que tu as fait vacuum full analyze que le plan d'exécution est correct ?
    Si tu ne recalcules pas les stats entre les fois où ça marche et les fois où ça plante, normalement le plan d'exécution ne devrait pas changer, donc si c'est plus long c'est peut-être que les ressources de la base et/ou du serveur sont sollicitées par d'autres sessions/programmes tournant en parallèle ?
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Par défaut
    Non ça ne marche pas mieux c'est aléatoire...ce matin plus de 3 secondes pour retourner le nombre 13 correspondant aux membres en ligne...

    Tu me parles de la charge de la base ou du serveur ? J'ai un quad core XEON 4 Go de ram et ce matin 30 connectés. Je regarde mes graphes MRGT et aucun pb...Je suis à 91 de charge pour un maxi de 1000

    Et puis quand il y a un pb avec cette requête il n'y en a pas avec une autre..

    Voilà les temps d'exécution quand tout est impec !

    J'ai trois requêtes dans ma page

    Temps d\'execution requete recherche info sur l'iinscrit : '0.004
    Temps d\'execution requete total inscrits en ligne : '0.0087
    Temps d\'execution requete pour affichage des membres: '0.0423


    Quand ça foire j'ai ça :
    Temps d\'execution requete recherche info sur l'iinscrit : '0.004
    Temps d\'execution requete total inscrits en ligne : '3,70
    Temps d\'execution requete pour affichage des membres: '12,678

    par exemple avec 50 inscrits en ligne ...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Par défaut
    J'ai fait des tests avec une requete tres simple au départ à laquelle j'ai ajouté des restrictions dans la clause WHERE jusqu'au moment où cela foire.

    Et bien j'avais des doutes sur quelque chose et ça c'est confirmé.

    C'est le inscrit_age BETWEEN 18 AND 99 qui pose problème parfois.

    je ne sais pas pourquoi mais ça s'emballe d'un coup..

    J'avais déjà eu un pb similaire avec inscrit_nb_enfant BETWEEN $1 AND $2...

    que je n'ai pas résolu d'ailleurs...

    Y a un pb avec le between dans cette base je pense...

    Voici la requête avec laquelle j'ai travaillé pour détecter le problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    	$requete = "SELECT count(*) FROM inscrit_en_ligne, inscrit WHERE inscrit_en_ligne_date_connexion >= '".$inscrit_date_connexion_limite."'";
      	$requete .="AND inscrit_en_ligne_inscrit_id <> '".$_SESSION['inscrit_id']."' AND inscrit_en_ligne_inscrit_id_crypte <> '".$_SESSION['inscrit_id_crypte']."'";
    	$requete .="AND inscrit_en_ligne_inscrit_id = inscrit_id ";
    	$requete .="AND inscrit_genre ='".$recherche[0]."'";
    	$requete .="AND inscrit_inscription_validee = 'OK' AND inscrit_suspendu = 'NO'";
    	if($age_min<>18 || $age_max<>99)
    	{
    		$requete .="AND inscrit_age BETWEEN '".$age_min."' AND '".$age_max."'";
    	}
    ce qui veut dire que si je laisse la requête faire un between 18 AND 99 sur 100 lignes elle prend un temps considérable.

    Si je spécifie un tranche d'age cela va un peu mieux...

  9. #9
    Membre Expert Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Par défaut
    Mets la requête qui marche bien et son plan d'exécution, et la requête qui est trop longue avec son plan d'exécution ce sera plus simple
    Combien de lignes sur les 100 dans ta table ont l'âge entre 18 et 99 ?
    La théorie, c'est quand on sait tout mais que rien ne fonctionne.
    La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
    Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

    Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Par défaut
    C'est la même requête...

    Sur les 100 tous ont forcément entre 18 et 99...mais cette requete sert également de filtre sur l'age

  11. #11
    jnore
    Invité(e)
    Par défaut
    Salut,
    Je m'imisse dans la discussion !
    Je ne connais pas la structure de ta table mais est-ce normal que tu mettes entre quote des valeurs numériques?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $requete .="AND inscrit_age BETWEEN '".$age_min."' AND '".$age_max."'";
    Il sera préférable pour un age donc un numéric de s'écrire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $requete .="AND inscrit_age BETWEEN ".$age_min." AND ".$age_max;

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Par défaut
    C'est dans mon fichier PHP que j'ai mis cette fonction pour test mais c'est une procedure stockée.

    Elle fonctionne cela dit très bien comme ça... et ce n'est pas je pense la raison du problème.

    Voilà la syntaxe qui est dans ma procédure stockée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IF ($1 <> 18 OR $2 <> 99) THEN
        requete := requete || ' AND inscrit_age BETWEEN ' || $1 || ' AND ' || $2;
    END IF;
    merci

Discussions similaires

  1. Requete avec WHERE et OR et temps de réponse déplorable
    Par olysmar2 dans le forum Développement
    Réponses: 5
    Dernier message: 17/06/2015, 21h43
  2. [WD16] Requete Interbase, Temps de réponse long.
    Par zozo66180 dans le forum WinDev
    Réponses: 13
    Dernier message: 13/09/2013, 16h17
  3. Temps de réponse d'une requete ACCESS
    Par sfeltan dans le forum C++Builder
    Réponses: 1
    Dernier message: 06/06/2007, 17h53
  4. Réponses: 3
    Dernier message: 06/02/2007, 15h19
  5. Temps de réponse entre deux sites
    Par coup dur dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 16/10/2003, 15h26

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