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 :

Amélioration rapidité requête


Sujet :

PostgreSQL

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut Amélioration rapidité requête
    Bonjour,

    Voici une requête très simple qui verifie l'unicité de l'adresse mail dans ma table. les adresses sont cryptées et cela met plus de 15 secondes sur 11 000 enregistrement pour me retourner un résultat.

    Les emails sont stockées dans un champ de type Text Unique avec index.

    Voici la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id_membre
    FROM inscrit
    WHERE pgp_sym_decrypt(dearmor(membre_email),$2) = $1;
    $2 = clé de cryptage
    $1 = email à vérifier

    Voici l'analyse de la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Seq Scan on inscrit  (cost=0.00..2683.30 rows=56 width=8) (actual time=1809.930..14227.619 rows=1 loops=1)
    Comment améliorer la rapidité selon vous car c'est le cryptage qui doit plomber la rapidité ?

    merci !

  2. #2
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Décidément tes problèmes de perf ça n'arrête pas
    Ta clé de cryptage est la même pour tous tes enreg ? Si oui tu peux essayer de créer un index de fonction sur pgp_sym_decrypt(dearmor(membre_email),ta_clé)
    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 habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    677
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Salut scheu !

    Ben oui j'essaie d'optimiser tout cela !

    Oui la clé de cryptage est la même pour tous !

    On crée comment un index de fonction ????

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 73
    Points
    73
    Par défaut
    Moi, j'aurai plutôt fait le contraire: chiffrer la clause de comparaison et la comparer à l'ensemble des valeurs dans la base plutot de de déchiffrer l'ensemble des valeurs de la base(ce qui sera forcement assez couteux) pour les comparer à une valeur non chiffrée

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    J'ai fait le temps d'exécution est le même...

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    J'ai créé un index sur la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE INDEX unicite_email ON inscrit  (pgp_sym_decrypt(dearmor(inscrit_email),'maclé'));
    C'est parfait les temps de réponse sont super !!! merci scheu !

  7. #7
    Membre expérimenté Avatar de scheu
    Inscrit en
    Juin 2007
    Messages
    1 506
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 1 506
    Points : 1 734
    Points
    1 734
    Par défaut
    Citation Envoyé par viny Voir le message
    J'ai créé un index sur la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE INDEX unicite_email ON inscrit  (pgp_sym_decrypt(dearmor(inscrit_email),'maclé'));
    Cela n'améliore absolument rien...
    Si tu faits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_membre
    FROM inscrit
    WHERE pgp_sym_decrypt(dearmor(membre_email),'clé') = valeurdetest
    passe-t-il par l'index ? As-tu (re)calculé les stats ?
    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/

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    J'avais laissé la clé en paramètre dans ma fonction donc l'index ne fonctionnait pas.

    C'est dommage d'ailleurs qu'il faille mettre la clé dans la fonction et plsu ne paramètre pour que cela fonctionne ...

  9. #9
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par viny Voir le message
    J'ai fait le temps d'exécution est le même...
    Comment l'as-tu fait ? en faisant un appel à la fonction de chiffrement dans la clause where ? Alors en effet, le résultat est le même car le chiffrement est refait pour chaque enregistrement sauf si ta fonction de chiffrement est déclarée comme "Stable strict"
    essaie en calculant d'abord la valeur chiffrée et en la passant dans ta requète en dur ensuite, avec un index sur les valeurs chiffrées. Si cela améliore tes perf, tu pouras passer par une petite procedure

    Créer un index avec la fonction et la clé, revient à indexer les valeurs déchiffrée, ce qui n'est probablement pas la meilleure idée en terme de sécuritée. Enfin si tu les chiffres j'imagine que tu as une bonne raison de le faire.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Tu peux me donner un exemple de ce que tu me conseilles de faire car je vois pas trop le code à écrire.

    merci

  11. #11
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 73
    Points
    73
    Par défaut
    étape 1: récupérer la valeur chiffrée correspondant une adresse précise que tu veux tester:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pgp_sym_encrypt('email', 'maclé');
    cela te retourne une valeur, appelons là valeur1 (requète à corriger/adapter en fonction du nom de la fonction et de la méthode pour l'appeler)

    étape 2: tester la requète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_membre
    FROM inscrit
    WHERE membre_email = 'valeur1';
    en ayant bien un index sur la colonne membre_email

    ça donne quoi ?

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Effectivement c aussi rapide et je préfère cette solution car ma clé reste toujours en paramètre !!!

    mais y a un pb !

  13. #13
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 73
    Points
    73
    Par défaut
    d'abord, est-ce que ça fonctionne à la main (hors procédure, on verra après comment l'écrire si oui) ?

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Ca fonctionne à la main ?

    La première solution avec l'index sur fonction oui fonctionne très bien la deuxième solution non...

  15. #15
    dk
    dk est déconnecté
    Membre actif
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 75
    Points : 238
    Points
    238
    Par défaut
    Comparer des chaines c'est coûteux en performance.

    Pour contourner ton probleme, je ferais à ta place :

    1 - Créer un champ supplémentaire 'email_tronque' avec seulement les 5 premiers caractères de ton email crypté

    2 - Comparer les 5 premiers caractères du mail crypté entré par l'utilisateur avec ce champ 'email_tronque'.

    3 - Ensuite suivant le nombre de résultat :

    0 : l'utilisateur n'existe pas
    >0 : il faut faire un autre select avec cette fois ci l'email crypté en entier sur les qqs résultats trouvés.


    bon courage

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 677
    Points : 160
    Points
    160
    Par défaut
    Non non c'est pas couteux avec la solution de Scheu c'est hyper rapide...

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

Discussions similaires

  1. Améliorer rapidité requête mysql
    Par Pitof dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/06/2011, 10h36
  2. Amélioration perf requête
    Par toulouseadr dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/07/2008, 08h37
  3. Amélioration de requête statistique
    Par Nuwanda dans le forum Langage SQL
    Réponses: 3
    Dernier message: 02/04/2008, 17h59
  4. [MySQL] Amélioration performance requête
    Par lodan dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 15/01/2007, 09h06
  5. améliorer une requête
    Par papilou86 dans le forum Access
    Réponses: 5
    Dernier message: 22/05/2006, 11h40

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