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 :

comment optimiser la config pour ce genre de requête absurde ?


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 424
    Points : 878
    Points
    878
    Par défaut comment optimiser la config pour ce genre de requête absurde ?
    bonjour,

    je voudrais optimiser mon serveur postgres (8.1 debian 2Go de RAM bi-xeon 5130) pour rendre l'exécution de cette requête monstrueuse plus rapide :


    select id from sale_order_line where (state in ('confirmed','confirmed_wait','missed')) and (id in (27403,27405,27399,16583,27395,19018,27394,21292,20594,19019,20593,7682,27392,17994,28130,18039,27389,27380,27379,27377,27378,18020,27374,18002,27373,17878,17877,18146,27369,27367,27364,9692,27362,27360,17710,27357,27356,27355,27354,18148,27185,27352,27350,27348,3354,27345,18191,17707,27347,27343,27341,27339,27338,27334,17702)) order by id DESC limit 50

    je ne peux pas intervenir sur le code de l'erp, juste sur les paramètres de psotgres voire de linux. cette requête prend 16s à donner les résultats, occupe lecpu à 100% et utilise 6% de la RAM (info obtenu sur un top en ligne de commande)

    là j'ai coupé mais en fait il ya plus (10pages) d'id dans la liste...
    j'a itenté d'enlever le order id mais ça change rien.

  2. #2
    Membre émérite
    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
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut avoir le EXPLAIN ANALYZE de la requête en question

  3. #3
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 424
    Points : 878
    Points
    878
    Par défaut
    voilà les détails obtenus avec un explain analyse précédent la requête (fait dans pgadmin):
    "Limit  (cost=0.00..26675.74 rows=50 width=4) (actual time=3.982..264.556 rows=50 loops=1)"
    "  ->  Index Scan Backward using sale_order_line_pkey on sale_order_line  (cost=0.00..1202542.36 rows=2254 width=4) (actual time=3.977..264.454 rows=50 loops=1)"
    "        Filter: ((((state)::text = 'confirmed'::text) OR ((state)::text = 'confirmed_wait'::text) OR ((state)::text = 'manquant'::text)) AND ((id = 27403) OR (id = 27405) OR (id = 27399) OR (id = 16583) OR (id = 27395) OR (id = 19018) OR (id = 27394) OR (i (..)"
    "Total runtime: 309.079 ms"
    

  4. #4
    Membre émérite
    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
    Points : 2 890
    Points
    2 890
    Par défaut
    Apparemment ça utilise bien un index (Index Scan Backward using sale_order_line_pkey) mais surtout le temps d'exec n'est que de 0.3s et pas de 16s

  5. #5
    Membre éclairé
    Avatar de clavier12AZQSWX
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2009
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 424
    Points : 878
    Points
    878
    Par défaut
    comme dit plus haut, il ya bcp (trop) d'éléments énumérés dans la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and (id in (x1,x2.x3....x25000)
    j'en ai dénombré entre 23000 et 25000. la requête complète fait 10-20pages de copier collé dans la console linux !

    je rappelle j'y peux rien si l'erp construit mal sa requête... où alors les développeurs n'avait pas prévu autant de donnée (25000 lignes de commandes/factures)

    pour info j'ai testé la base sur une autre machine (vm s7 x64 workstation avec 1 core 3.33ghz et 1ghz de mémoire alloués) et la requête prend 3s au lieu des 15s du bi-xeon à 2Ghz.

    ce gain énorme dans le passage à la VM.....normal pas normal...à réfléchir...?
    Ya 6ans de techno de différence entre le core 3.3ghz du core i7-975 et le vieux core 2.0ghz du xeon 5130. ou alors c'est l'encapsulation du système de fichier dans la vm qui augmente les perfs (car moins de lecture/écriture réelles).

  6. #6
    Membre émérite
    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
    Points : 2 890
    Points
    2 890
    Par défaut
    La différence de perfs est difficile à expliquer sans regarder en détail tous les indicateurs susceptibles de faire varier les perfs et il y en beaucoup: taille de cache disque, à supposer que la table et index y soit, et si il y a des E/S disques, la quantité de bloc transférés est-elle la même et la vitesse de transfert est-elle la même?

    Par ailleurs la différence d'âge des CPUs joue certainement, sans être un connaisseur du hardware, un facteur 5 entre des générations séparées de 6 ans ne parait pas délirant.

  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 736
    Points
    1 736
    Par défaut
    Sur la requête en elle-même :
    - combien de lignes au total dans la table sale_order_line ?
    - combien de lignes renvoyées dans le résultat de la requête ?

    Si la requête te renvoie au moins 15-20% du nombre total de lignes de ta table, une lecture unique de toute la table serait peut-être déjà plus performante qu'un accès par index, dans ce cas tu pourrais essayer de mettre le paramètre enable_indexscan à off dans la session pour désactiver l'accès par index

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 888
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 888
    Points : 53 122
    Points
    53 122
    Billets dans le blog
    6
    Par défaut
    Le seul moyen d'être réellement efficace dans ce cas de figure est d'ajouter une table de travail pour gérer ces listes, alimenter cette table avec la liste de valeur et lancer une requête faisant une jointure avec cette table de travail.
    Si l'ERP a été mal conçu, relancez l'éditeur de cet ERP pour qu'il repense sa solution.

    A +

Discussions similaires

  1. cpu à 100% avec 1.5% de ram utilisé, comment optimiser la config ?
    Par clavier12AZQSWX dans le forum Administration
    Réponses: 18
    Dernier message: 23/11/2011, 09h49
  2. Réponses: 2
    Dernier message: 26/07/2011, 09h19
  3. Comment utiliser App.Config pour traduire une appli ?
    Par jjcasalo dans le forum VB.NET
    Réponses: 6
    Dernier message: 09/06/2011, 11h25
  4. [PowerShell] Comment optimiser get-childitem pour ne pas parcourir tout un repertoire ?
    Par yapooze dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 02/11/2010, 10h25
  5. Réponses: 6
    Dernier message: 23/02/2007, 21h20

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