Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pour les connaisseurs de postgresql

Optimisation

Sujet résolu
    4 janvier 2012 à 11:58:57

    Bonjour à tous, j'ai une question plutôt pointu sur postgresql.

    J'utilise des fonctions pl/pgsql et dans l'une d'elle j'utilise une requête avec un Like comme règle de filtrage :

    CREATE FUNCTION exemple(argument VARCHAR(50)) RETURNS INTEGER AS $$        
        BEGIN
            
         SELECT * FROM ma_table WHERE mon_champ LIKE argument || '%';   
     
        RETURN 1;
    
        END;
    $$ LANGUAGE plpgsql;
    


    Cette fonction est fausse mais c'est juste un exemple.
    Comme on le voit, on veut récupérer les lignes commençant par le contenu de argument .
    D'après ce que j'ai lu dans la documentation, Postgresql n'utilisera pas l'index sur mon_champ car il ne sait pas si argument commence par un % (ce qui empêcherai l'utilisation de l'index).
    Est il possible de faire comprendre à postgresql que argument ne commencera jamais par un %.

    Merci à ceux qui auront les compétences et le temps de me répondre.
    • Partager sur Facebook
    • Partager sur Twitter
      4 janvier 2012 à 13:58:26

      Ton problème est que postgresql pré-compile les plans d'exécutions des requêtes dans les procédures stockées. Le plan d'exécution avec index ne marche que si 'argument' ne commence pas par un "%", donc il ne peut pas être utilisé dans ce cas, effectivement.

      Utilise EXECUTE ... USING ... pour éviter la mise en cache des plans d'exécutions :

      http://www.postgresql.org/docs/9.1/sta [...] EXECUTING-DYN

      (note que dans ce cas, la requête marchera aussi si l'argument contient un %)

      • Partager sur Facebook
      • Partager sur Twitter
        4 janvier 2012 à 14:14:05

        Merci pour la réponse, je vais me pencher sur le sujet.
        • Partager sur Facebook
        • Partager sur Twitter

        Pour les connaisseurs de postgresql

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown