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 :

optimisation :explain et fuite temporelle


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut optimisation :explain et fuite temporelle
    Ok j'ai ce que j’appellerais "une fuite temporelle".

    Je viens de découvrir "EXPLAIN" et je l'applique donc sur un requête qui me prend bien 5 secondes sauf que le EXPLAIN me donne un coût final de 362 ce qui sur mes autres requêtes vaut à peine 100 ms en général.

    Je fais donc un EXPLAIN ANALYZE et là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    "Hash Semi Join  (cost=360.62..362.76 rows=1 width=18) (actual time=12117.600..12117.673 rows=11 loops=1)"
    "  Hash Cond: (publication_validation.pubval_pub_id = test.pub_id)"
    "  ->  Seq Scan on publication_validation  (cost=0.00..1.90 rows=90 width=18) (actual time=0.015..0.070 rows=25 loops=1)"
    "  ->  Hash  (cost=360.60..360.60 rows=1 width=4) (actual time=12117.503..12117.503 rows=11 loops=1)"
    "        ->  HashAggregate  (cost=360.58..360.59 rows=1 width=4) (actual time=12117.453..12117.474 rows=11 loops=1)"
    "              ->  Nested Loop  (cost=12.08..360.58 rows=1 width=4) (actual time=10477.601..12117.351 rows=12 loops=1)"
    "                    Join Filter: ((author_publication_personne.publication_pub_id = test.pub_id) AND (pmid_requete.pmid_valeur = test.pub_pmid))"
    "                    ->  Nested Loop  (cost=12.08..349.33 rows=1 width=8) (actual time=0.593..700.076 rows=113758 loops=1)"
    "                          ->  Nested Loop  (cost=12.08..341.80 rows=1 width=8) (actual time=0.545..56.977 rows=687 loops=1)"
    "                                ->  Nested Loop  (cost=12.08..338.36 rows=1 width=8) (actual time=0.512..39.788 rows=619 loops=1)"
    "                                      ->  Nested Loop  (cost=12.08..337.49 rows=1 width=8) (actual time=0.473..27.738 rows=42 loops=1)"
    "                                            Join Filter: ((personne.per_normedprenom)::text = (author.aut_normedforename)::text)"
    "                                            ->  Hash Join  (cost=12.08..83.71 rows=48 width=20) (actual time=0.362..17.912 rows=48 loops=1)"
    "                                                  Hash Cond: (personne.per_id = profilproj.personne_per_id)"
    "                                                  ->  Seq Scan on personne  (cost=0.00..64.02 rows=1902 width=20) (actual time=0.030..13.820 rows=1902 loops=1)"
    "                                                  ->  Hash  (cost=11.48..11.48 rows=48 width=8) (actual time=0.292..0.292 rows=48 loops=1)"
    "                                                        ->  Seq Scan on profilproj  (cost=0.00..11.48 rows=48 width=8) (actual time=0.017..0.196 rows=48 loops=1)"
    "                                            ->  Index Scan using aut_normedlname on author  (cost=0.00..5.23 rows=4 width=17) (actual time=0.042..0.167 rows=12 loops=48)"
    "                                                  Index Cond: ((author.aut_normedlastname)::text = (personne.per_normednom)::text)"
    "                                      ->  Index Scan using author_has_publication_fkindex1 on author_publication_personne  (cost=0.00..0.70 rows=13 width=8) (actual time=0.034..0.220 rows=15 loops=42)"
    "                                            Index Cond: (author_publication_personne.author_aut_id = author.aut_id)"
    "                                ->  Index Scan using req_profilproj_pro_id_idx on requetepubmed  (cost=0.00..3.43 rows=1 width=8) (actual time=0.011..0.014 rows=1 loops=619)"
    "                                      Index Cond: (requetepubmed.profilproj_pro_id = profilproj.pro_id)"
    "                          ->  Index Scan using pmid_req_req_id_idx on pmid_requete  (cost=0.00..7.52 rows=1 width=8) (actual time=0.008..0.351 rows=166 loops=687)"
    "                                Index Cond: (pmid_requete.requete_req_id = requetepubmed.req_id)"
    "                    ->  Seq Scan on test  (cost=0.00..10.50 rows=50 width=8) (actual time=0.002..0.047 rows=25 loops=113758)"
    "Total runtime: 12120.127 ms"
    Alors soit j'ai la berlue soit J'ai un trou entre 700 ms (ligne 9) et 10477(ligne 7).

    Comme je dit je débute avec le Explain (et son interprétation) quelqu'un aurait il une explication?


    Ah et la requête en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE import_brut_pubmed.publication_validation SET pubval_regle4 = 1 WHERE pubval_pub_id in ( SELECT DISTINCT pub_id 
    FROM annuaire.personne,  mod_proj.profilproj,  mod_proj.requetepubmed, import_brut_pubmed.pmid_requete,  test, import_brut_pubmed.author_publication_personne, import_brut_pubmed.author 
    WHERE  personne.per_id = profilproj.personne_per_id AND requetepubmed.profilproj_pro_id=profilproj.pro_id AND requetepubmed.req_id = pmid_requete.requete_req_id AND pmid_requete.pmid_valeur = test.pub_pmid AND test.pub_id = author_publication_personne.publication_pub_id AND author_publication_personne.author_aut_id = author.aut_id 
    AND  personne.per_normednom=author.aut_normedlastname AND    personne.per_normedprenom=author.aut_normedforename );

    Désolée pour ceux à qui ça à fait saigner les yeux ....

    ps: j'ai testé en remplaçant le From tab1,tab2... where .... par des INNER JOIN mais j'ai la même trace. (C'est pas moi qui ai écrit la requête au départ...)

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Il est possible d'avoir une représentation visuelle un peu plus sympa en copiant le plan ici:
    http://explain.depesz.com

    Ce qui est bizarre surtout à la ligne 9:
    Nested Loop  (cost=12.08..349.33 rows=1 width=8) (actual time=0.593..700.076 rows=113758 loops=1)"
    
    C'est que l'estimation est d'1 ligne alors que la réalité est de 113758 lignes.
    Souvent ça veut dire que les statistiques ne sont pas à jour (faire ANALYZE sur les tables concernées pour être sûr) ou bien que certaines colonnes ont un échantillon statistique trop faible, ce dernier paramètre étant réglable par colonne avec ALTER TABLE.. ALTER COLUMN...SET STATISTICS

    Apparemment la table test est parcourue 113758 fois (voir dernière ligne de l'explain) ce qui explique probablement la lenteur globale, même si la table a peu de lignes.

  3. #3
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Il est possible d'avoir une représentation visuelle un peu plus sympa en copiant le plan ici:
    http://explain.depesz.com

    Ce qui est bizarre surtout à la ligne 9:
    Nested Loop  (cost=12.08..349.33 rows=1 width=8) (actual time=0.593..700.076 rows=113758 loops=1)"
    
    C'est que l'estimation est d'1 ligne alors que la réalité est de 113758 lignes.
    Souvent ça veut dire que les statistiques ne sont pas à jour (faire ANALYZE sur les tables concernées pour être sûr) ou bien que certaines colonnes ont un échantillon statistique trop faible, ce dernier paramètre étant réglable par colonne avec ALTER TABLE.. ALTER COLUMN...SET STATISTICS

    Apparemment la table test est parcourue 113758 fois (voir dernière ligne de l'explain) ce qui explique probablement la lenteur globale, même si la table a peu de lignes.
    Ok merci pour le lien déjà

    La table Test est une table temporaire faite à partir du filtrage d'une autre table (je passe d'une table de 52000 lignes à une de 25) du coup y a pas de statistiques dessus je pense.
    Je me penche là dessus.

    Merci !

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. Explain PLSQL optimisation
    Par nathieb dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/09/2007, 22h08
  3. Réponses: 4
    Dernier message: 15/12/2002, 04h19
  4. Réponses: 8
    Dernier message: 17/10/2002, 12h52
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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