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 :

Explain sur une procédure pl/pgsql


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut Explain sur une procédure pl/pgsql
    Bonjour,
    Je teste une procédure écrite en pl/pgsql, et c'est vraiment très lent alors qu'à priori il y a des index qui devraient permettre des requêtes assez rapides. J'ai exécuté quelques SELECT, présents dans la procédure, directement sous psql et ils sont très rapides.

    Est-ce qu'il y a un moyen d'avoir des détails sur la manière dont les requêtes sont exécutées dans la procédure. J'ai lu qu'on ne pouvait pas utiliser explain sur une fonction. Et je ne vois pas de moyen d'aller "voir sous le capot". J'utilise des FOR .. IN SELECT .. et des SELECT INTO .. n'ayant que très peu de résultats, par contre le nombre total de lignes de mes tables est énorme.

    Merci d'avance, je ne vois pas du tout où chercher.

  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
    En plpgsql, les requêtes sont préparées, donc pour voir leur plan d'exécution de l'extérieur, il faut procéder en deux temps, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PREPARE a(int) AS SELECT 1 FROM table WHERE id=$1;
    EXPLAIN ANALYZE EXECUTE a(100);

  3. #3
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    A vrai dire je débute et je n'ai pas lu PREPARE dans la doc ou les exemples, j'appelle directement les requêtes comme ceci (c'est un extrait seulement):

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE OR REPLACE FUNCTION delete_document(doc_id integer) RETURNS void AS
    $$
    DECLARE
        doc_id_token integer;
        token_index_reference integer;
    BEGIN
        -- Clean the no-longer used tokens
        FOR doc_id_token IN SELECT id_token FROM inverted_index WHERE id_doc = doc_id LOOP
            SELECT INTO token_index_reference id_token FROM inverted_index WHERE id_doc != doc_id AND id_token = doc_id_token;
            IF token_index_reference IS NULL THEN
                DELETE FROM tokens WHERE id_token = doc_id_token; -- Delete the token
            END IF;
        END LOOP;
    END;
    $$ LANGUAGE plpgsql;

    Et en cherchant comment utiliser le PREPARE je suis tombé sur ce message :
    Citation Envoyé par Tom Lane
    You do not need PREPARE at all in plpgsql. plpgsql's automatic
    caching of plans gives you the effect of PREPARE on every statement
    without your having to ask for it.

  4. #4
    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
    Je me suis peut-être mal exprimé.
    Je ne suggère pas d'ajouter des PREPARE à l'intérieur de plpgsql, car justement l'interpréteur du langage le fait tout seul, donc ça ne servirait à rien.
    Ce que je voulais dire, c'est que pour voir de l'extérieur de plgpsql le plan d'exécution tel que va l'exécuter l'interpréteur plpgsql, il faut utiliser PREPARE.

  5. #5
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Autant pour moi j'avais compris de travers ! Merci pour cette indication, j'ai pu voir ce que donne mes SELECT, par contre à propos des boucles FOR .. IN SELECT, Est-ce que le SELECT utilisé peut être analysé de la même manière qu'un SELECT normal ? (en fait, est-ce que le plan prévu pour la requête sera le même qu'avec la boucle utilisant cette requête)

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Par défaut
    Essayez de travailler en ensembliste au maximum. Faire X boucles sur X requêtes dans une procédure stockée est contre performant, en plus d'être moins lisible.

    Normalement vous pouvez faire un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE FROM tokens 
    WHERE NOT EXISTS (	SELECT * FROM inverted_index 
    			WHERE inverted_index.id_token = tokens.id_token 
    			AND inverted_index.id_doc != doc_id)

  7. #7
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    En effet je n'avais pas pensé comme ça, je n'ai pas la logique ensembliste, merci pour la remarque

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

Discussions similaires

  1. pointer sur une procédure d'un autre module
    Par jeje22 dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/07/2007, 11h30
  2. [Delphi 2006] Pb de cast sur une procédure
    Par NewSoftVision dans le forum Delphi
    Réponses: 5
    Dernier message: 02/05/2007, 08h09
  3. Aide sur une Procédure stockée
    Par NicoNGRI dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/12/2006, 00h48
  4. Gros Pb de perf sur une procédure stockée
    Par El Riiico dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 05/05/2006, 15h51
  5. Réponses: 4
    Dernier message: 14/06/2004, 16h18

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