PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

insert/update très massifs dans table de 50 M de record.

Technique - optimisation | insert/update très massifs dans table de 50 M de record.

Par nuggets le 25/07/2006 - 10:48

Mon problème :
update de 50.000.000 de records et insert de 2.000.000 d'une façon régulière

je veux améliorer les performances qui sont très insuffisantes.

J'ai exploré les pistes :
- englober les opérations par milliers (2000-3000-5000) au sein de transaction entre BEGIN et COMMIT
- modifier les paramètres du postgresql.conf
shared_buffers (plusieurs essais 30000 50000 75000)
fsync = off (la perte de donnée en cas de crash , n'est pas génante, je peux traiter les données non insérées le lendemain)
checkpoint_segments = 10 (+sieurs essais 20 - 30)
checkpoint_timeout = 1000 (+sieurs essais 30-1800)
stats_start_collector = off (désactivation récup des stats)

Je n'ai pas la possibilité de travailler sur plusieurs disques durs pour le moment.

Sans toutefois arriver à des résultats probants.

Pour information supplémentaire : la table à une dizaine de champ text + deux champs date.

Avez vous des conseils ? des solutions ?
Connaissez vous les meilleures optimisations possibles pour mon cas ?
Merci

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Questions

Jean-Paul Argudo/ = 25 Juillet, 2006 - 15:04

Bonjour,

Vous avez omis de décrire votre matériel et l'installation de PostgreSQL (version, OS, distrib linux/bsd...), si vous aviez déplacé pg_xlog/ ou pas, etc...

Faites vous des vacuum (full) et/ou analyze ou pas entre chaque opérations, tests.. ?

Avez-vous pensé à partitionner vos données?

Bref, essayez de nous apporter plus de précisions. Merci :)

--
Jean-Paul ARGUDO
www.dalibo.com


bonjour ma version de postg

nuggets/ = 25 Juillet, 2006 - 16:19

bonjour
ma version de postgres est 8.1.4
j'utilise un debian Linux sa 2.6.17-mm2
Je n'ai pas déplacé le pg_xlog car je ne peux pas utiliser de 2ème disque pour le moment.
Cette machine est en RAID 1 d'ailleurs.
Oui je fais des vacuum de temps en temps

Par contre j'ai un doute sur le partitionnement des données ....
j'ai bien lû que le planificateur de requêtes pouvait utiliser le partitionnement des tables pour ne pas avoir à parcourir toutes la table ... mais j'en sais pas plus.

Les requêtes qui sont faites par mon programme sont syntaxiquement très simple :
UPDATE table set dat_update=current_date where id=XXXX ;
si not found
insert into table


Partitionner? mais sur quelle machine?

Jean-Paul Argudo/ = 26 Juillet, 2006 - 01:28

Bonsoir,

Merci pour les détails sur les versions que vous utilisez. Mais quid de la machine elle-même? Est-ce un Pentium II recyclé ou un quadri-opteron? Fréquence et nombre de cpus? Caractéristiques des disques (ide,sata,scsi... KT/min... etc)? Caractéristique de la carte raid (la cartounette intégrée dans la CM (mal) ou une Carte SCSI dédiée avec piles (bien)?)... Etc..

Pour vos opérations, cela me semble très curieux. Votre update consiste à ne mettre à jour que la ... date de mise à jour? Sans modifier aucun autre champs?

Néanmoins, essayez de trouver une clé de répartition de vos données.. Le cas échant, découpez sur les IDs ? Peut être créer une 20aine de tables héritées? À voir, réfléchir, et surtout tester.

Plus d'infos sur le partitionnement, lire ce paragraphe de la documentation (Fr).

Bon courage!

--
Jean-Paul ARGUDO
www.dalibo.com


Merci bcp de votre disponibil

nuggets/ = 26 Juillet, 2006 - 10:54

Merci bcp de votre disponibilité.
Renseignement pris.
La machine fonctionne avec un bi xeon 2.40GHz (cache de 512KB)

J'ai deux disques en RAID 1 logiciel.
Les disques sont scsi U320 mais la carte SCSI est en U160.

Je ne dispose pour le moment sur cette machine de test que de 1Go de mémoire vive, mais j'aurai au moins le double en production.

Mon sysadmin me confirme que les écritures sont loin d'être bloquantes (vu avec iostat).

Oui mes update ne mettent que à jour une date de mise à jour.
En effet je conserve un historique dans cette table, de nouvelles données sont insérés mais pour celle qui étaient déjà en base je dois les conserver et updater la date màj.

Les performances sont les suivantes :
120 records traités à la seconde en update et insert.

Pour information, quand la table était vide, j'obtenais des performances 10 fois supérieures entre dans les 1400 records/s.

Enfin la place disque totale utilisé par la base de donnée est pour le moment de 14Go ce qui est très supérieure à la mémoire vive ....

La solution de partionnement me semble une piste intéressante mais elle me paraît une peu fastidieuse à mettre en oeuvre.
Si je peux l'éviter en changeant des paramètres c'est mieux.


autre donnée

nuggets/ = 26 Juillet, 2006 - 11:03

j'ai oublié de préciser que peu de connexion sont établies sur cette base. Moins d'une dizaine.
J'ai LE programme qui fait des inserts/updates massifs et qui rencontre les difficultés de performances.

+ des programmes (2-3) qui font des parcours et recherches sur ces tables.


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.