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 :

Requête lente sur une grosse table


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut Requête lente sur une grosse table
    Bonjour,

    J'ai une table "utilisateurs" avec des champs classiques (nom, prénom, age, ...).
    J'ai 350 000 utilisateurs.
    J'ai un champ boolean qui me sert pour des traitements divers...
    Je fais une requête, tout simple, qui prend un temps fou!!
    UPDATE utilisateurs SET bprocessed = 'False'
    Je met entre 5 et 10 minutes pour executer ça, parfois plus...

    J'ai essayé comme ça :
    UPDATE utilisateurs SET bprocessed = 'False' WHERE bprocessed = 'True'
    Je gagne un peu, mais c'est encore très long...

    Auriez-vous des idées pour que je speed un peu plus de genre de requête?
    J'ai essayé de passer par une function, mais c'est pire.
    Je connais pas trop les transactions, peut etre par là il y aurai une piste...

    Merci de votre aide et de vos conseils.

    Mathieu

  2. #2
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Bonjour,


    350 000 enregistrements ce n'est pas monstrueux, donc il ya peut etre un peu d'optimisation a faire.

    quand tu fais un update, tu n'utilise pas de clef ?
    parce faire a chaque fois un update de la table sans critere, pg comme tout autre sgbd fait du scan table (il parcours chaque enregistrement)

    Il faut passer par un index, mais mettre un index sur bprocessed n'est pas non plus jusdicieux, un index est efficace quand il y a beacoup de données differentes, or true / false, ca le fait pas.

    en fait, il faut peut etre repenser la maniere d'attaquer ta base, a quoi te sert bprocessed ?

  3. #3
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    L'idée, c'est que tous ces utilisateurs arrivent d'une autre application, où je n'ai pas la main.
    J'ai un fichier csv avec tous mes utilisateurs qui arrivent.
    J'import ce fichier. Je l'import pas brute, je fais des traitements, vérification de données (le fichier est souvent pourri), calcul de certains champs, et j'update si l'utilisateur existe ou j'insert.
    Tous les utilisateurs présent dans la base mais NON présent dans le fichier doivent être supprimé.
    Donc j'utilise ce boolean "bprocessed". Je le met à False au début de l'import pour tous les utilisateurs, puis j'insert, et update en mettant ce boolean à True.
    A la fin de l'import, tous les utilisateurs avec un "bprocessed" = 'False', je les supprime.
    L'import suivant, je repasse bprocessed à False pour tout le monde, c'est ça qui me prend du temps...
    La méthode n'est peut etre pas terrible (ce système de boolean), mais j'ai pas trouvé mieux.
    Si vous avez des idées, je suis preneur.

    Merci

    Mathieu

  4. #4
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    Peux tu me donner une description de ton serveur (RAM/PROC/ DD / RAID ) ?
    on va essayer d'optimiser si ce n'est pas deja fait.

  5. #5
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 103
    Points : 66
    Points
    66
    Par défaut
    Merci de ton aide!

    Alors le serveur:
    Proc: Intel Xeon 2,50GHz
    Ram: 1,50 Go
    OS: Windows Server 2003
    Prostgres: 8.1.3

    L'installation est basique, aucune optimisation ou configuration n'a été faite.

    Merci.

    mathieu

  6. #6
    Membre émérite
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Points : 2 545
    Points
    2 545
    Par défaut
    En terme de perf, sous windows, je sais pas ce que ca va donner, mais on va essayer :


    essaye les valeurs suivantes dans postgresql.conf

    max_connections = xx
    >> combien d'users se connecte sur la base ? du peut peut etre reduire

    shared_buffers = 64MB
    work_mem = 8MB
    maintenance_work_mem = 32MB
    max_fsm_pages = 409600 # par defaut 204800



    Redemarre le service, peut etre que ca repartira pas, pas de panic, reduit les val (surtout max_fsm_pages), le parametrage depend des machines, et sous windows ca tourne pas pareil pour la gestion de la memoire

  7. #7
    MrX
    MrX est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Le problème peut également venir d'un trigger.

    @++ Xav

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 245
    Points : 262
    Points
    262
    Par défaut INDEX
    Bonsoir
    Cela semble long
    Vous pouvez essayer de créer un index.
    1] CREATE INDEX utilisateurs.idx ON utilisateurs USING BTREE(bprocessed);
    2] CLUSTER utilisateurs.idx ON utilisateurs ;
    Lancez aussi au shell vacuum verbose analyze;
    faites un nouveau test de façon identique...
    Pour infos les performances de Postgresql (8.2) sur O/S Microsoft (Longhorn / server 2008) sont pratiquement
    identiques comparativement aux autres versions qui tournent sur LINUX ,BSD ,AIX OU SOLARIS etc..
    Pour la forme je pense qu'une requête sur deux tables ensuite permutées peut être plus efficace (en temps de reponse).
    Bonne chance

Discussions similaires

  1. Requête lente sur une table
    Par ninikkhuet dans le forum Administration
    Réponses: 6
    Dernier message: 15/02/2010, 19h45
  2. Optimisation d'une requête SELECT sur une grosse table
    Par eracius dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/05/2008, 15h51
  3. Création d'un index sur une grosse table
    Par Jester dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 02/04/2008, 13h44
  4. Quellue interface pour travailler sur une grosse table ?
    Par grinder59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 22/12/2006, 17h25
  5. Update trés lent sur une grosse table
    Par neo.51 dans le forum Oracle
    Réponses: 21
    Dernier message: 14/12/2005, 12h06

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