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

Requêtes PostgreSQL Discussion :

Requête PostgreSQL très lente


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 13
    Points : 13
    Points
    13
    Par défaut Requête PostgreSQL très lente
    Bonjour à tous,

    J'ai une table sous PostgreSQL : temp avec 4 colonnes (id int, campaign character varying, sender character varying, date_s date) de près de 9 millions lignes. Et c'est une table sans index.

    Le souci intervient à chaque fois que j'essaie d'exécuter cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM temp WHERE id = $idmail and campaign = '$variable_campaign' AND date > '$date_c' "
    dans une boucle de 100K

    Je n'ai toujours pas obtenu de réponses (depuis 20/30 minutes). (Comme j'ai mis un set_time_limit illimité en PHP sinon j'aurai obtenu 500 error en 5 minutes)

    En fait le but de toutes ces requêtes c'est de récupérer une liste de mails auxquels la campagne n'a pas été envoyé cette semaine.

    Avez-vous des pistes svp, je me retrouve un peu bloquée.

    J'avais aussi en tête si jamais je ne pourrai pas exécuter des requêtes sur une table de 9M de faire une sorte de système de fichiers temporaires mais je trouvais plus propre de le faire avec une base de données...

    Merci pour vos réponses !

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Déjà pour la requête en elle même il faudrait un index.

    l'index doit être comme ceci : id, campaign , date


    Ensuite on peut se poser la question sur l'utilité de faire cette requête 100k fois.


    Vous devriez pouvoir sortir les résultats nécessaire en 1seule requête, et globalement le coup de cette unique requête devrait être inférieur à l’exécution des 100k autres.

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    clairement, mettre un index adapté pour cette requête par exemple

    ensuite $date_c varie-t-il pour chaque requête ?
    si non, pourquoi ne pas faire un joli group by ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Très bien pour l'index. Merci !

    Du coup j'ai pensé à une requête de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_mail from temp t right join mail m ON t.id_mail = m.m_id where t.campagne != '$variable_campaign' AND date > '$date_c' "''
    La variable $date_c ne varie pas, et si jamais elle varie je ferai uniquement une boucle sur la date (3 ou 4 dates maximum) ce qui me fera largement moins de 100K requêtes.

    Je vais essayer la requête et je vous tiens au courant de son temps d'exécution.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Votre besoin s'exprimera très bien en une seule requête.

    Pouvez-vous fournir la structure des tables complètes ainsi que leur fonctionnement ?

  6. #6
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 681
    Points
    18 681
    Par défaut
    bizarre on est passé de = à != pour '$variable_campaign'


    Ce genre de requête ne serait-elle pas appropriée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(1) FROM temp WHERE date > '$date_c' GROUP BY (id,campaign)

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Finalement la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_mail from temp t right join mail m ON t.id_mail = m.m_id where t.campagne != '$variable_campaign' AND date > '$date_c'
    fonctionne très bien ! Temps d'exécution de moins de 2 minutes

    Pour la suite j'ai décidé de faire des procédures PL/SQL

    Merci pour vos contributions

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    bizarre on est passé de = à != pour '$variable_campaign'


    Ce genre de requête ne serait-elle pas appropriée ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(1) FROM temp WHERE date > '$date_c' GROUP BY (id,campaign)
    Je vais l'essayer et voir ce que ça donne

    Merci encore !

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

Discussions similaires

  1. [MySQL] Requête simple très lente
    Par TigerCX dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/04/2015, 15h18
  2. Requête SQL très lente
    Par fishingman dans le forum VB.NET
    Réponses: 9
    Dernier message: 13/08/2012, 12h15
  3. Réponses: 0
    Dernier message: 28/10/2009, 07h00
  4. Requête Access trés lente ?
    Par ghostdz dans le forum Bases de données
    Réponses: 4
    Dernier message: 03/08/2007, 08h41
  5. Réponses: 12
    Dernier message: 24/07/2007, 11h09

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