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 :

Plusieurs gros insert en parallèle


Sujet :

Requêtes PostgreSQL

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Plusieurs gros insert en parallèle
    Bonjour tout le monde,

    Depuis quelques jours, je rencontre quelques difficultés en termes de performances, aussi j'aimerais profiter de vos lumières.

    Contexte :
    J'ai un client lourd, relié à une base Postgresql 9.0.
    J'utilise sqlalchemy pour mon application, mais je ne pense pas que ça change grand chose.
    Pour résumer, j'ai 2 tables vraiment importantes.
    Une table "users" d'environ 50 millions de lignes, et une table "tasks", beaucoup plus petite (une centaine de lignes pour l'instant). J'utilise également une autre table pour la relation ManyToMany existant entre users et tasks. Appelons-la "tasks_users".
    Rien de bien compliqué, en somme.

    Ma table "users" est accédée en lecture et écriture environ 30 fois par secondes (update ou lecture d'une ligne à la fois) sans me causer de soucis particuliers.
    La table tasks_users est accédée en lecture de temps à autres (un select pour savoir dans quelles tâches apparait un user donné), une fois toutes les 10 secondes par exemple.

    Là où les problèmes commencent à survenir, c'est quand je construis de nouvelles tasks.
    En général, une task contient environ 100.000 users, mais c'est assez variable.
    J'ai donc des périodes où je dois procéder à des inserts assez importants, et souvent en même temps.
    Typiquement, une vingtaine d'inserts de 50.000 à 500.000 lignes chacun.

    Après quelques benchmarks, avec mon application au repos, j'obtenais des résultats de l'ordre de 300s pour un insert de 100.000 lignes.
    Je m'attendais à des ralentissements en effectuant plusieurs inserts en même temps, mais tout de même...

    En en faisant tourner 2 simultanément, le premier se terminait en grosso-modo 300s, tandis que le second s'est terminé une heure plus tard (toujours sans application qui tourne, rien qu'au niveau SBGD).
    Un autre essai me donne 300s et 900s pour le second.

    Lorsque je fais tourner mon application, c'est encore pire. Surement que les lectures occasionnelles ne doivent pas aider, mais là j'ai lancé l'initialisation de 20 tâches d'environ 100.000 utilisateurs, et 10 heures plus tard je n'en ai que la moitié de terminées.

    Note : j'utilise des transactions bien sûr. J'ai lu sur la doc que désactiver les index pendant l'insert améliorait les performances, mais comme j'ai des lectures en même temps, je me demande si c'est vraiment pertinent.
    J'ai également essayé de diviser mes transactions en sous-tâches plus petites (par exemple, au lieu d'une transaction de 100.000, en faire 10 de 10.000, afin de relâcher des locks éventuels plus souvent ou je ne sais quoi, mais sans résultat très probant. Je dirais même que c'est plutôt pire).

    Quelqu'un aurait une idée pour améliorer tout ça ?
    Dernière modification par ced ; 19/08/2011 à 16h58. Motif: Ajout des accents

Discussions similaires

  1. [transaction]effectuer plusieurs requetes insert into
    Par jano_dave dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/04/2009, 23h10
  2. Jointure entre plusieurs requetes INSERT INTO
    Par Bernard67 dans le forum Requêtes et SQL.
    Réponses: 18
    Dernier message: 11/01/2009, 18h42
  3. [phpMyAdmin] Effectuer plusieurs requêtes Insert silmultanées
    Par lolymeupy dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 02/03/2008, 18h43
  4. Réponses: 7
    Dernier message: 28/01/2008, 10h43
  5. Plusieurs requêtes INSERT en même temps
    Par jeyce dans le forum JDBC
    Réponses: 3
    Dernier message: 06/11/2006, 09h42

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