Re: traitement par lots et sequence

Emmanuel BEZAGU <[email protected]> Wed, 12 Jun 2019 13:20:18 +0200
Newsgroups gmane.comp.db.postgresql.french
Message-ID <11339_1560338406_5D00DFE6_11339_652_1_7397a258-e839-70b2-6901-b569f5958534@dgfip.finances.gouv.fr>
Bonjour,

voici comment je procéderais (en partant du principe que nous avons n 
enregistrements à insérer)
1. recherche du numéro de séquence actuel n0
2. on force la séquence à repartir à la position n0+n+1 de manière à 
laisser un trou de n valeurs qui seront consommées dans nos insert
3. génération d'un script constitué de 2 instructions COPY : 1 pour la 
table mère, et 1 pour la table fille. Le numéro de séquence est pris de 
(n0+1 à n0+n)
4. lancement du script d'insertion en masse

Cordialement

Le 12/06/2019 à 12:48, Daniel Verite a écrit :
> 	CRUMEYROLLE Pierre wrote:
>
>> 3 -  boucle sur tous les id de mère
>> for i in liste_id_mere
>> {
>>     insertion d'un  paquet de j  filles pour une mère
>>     insert into T_filles idFils,idMere,datamere values
>> ((j,i,dataf1),(j,i,dataf2),(j,i,dataf3), .... (j,i,datafn));
>>      }
>> }
>>
>> je suis obligé de faire de  l'insert par batch  car l'insertion
>> unitaire postgresql n'est pas top , seul le traitement par lots donne
>> des perfs convenables.
> N'oubliez pas de faire tout ça dans la même transaction, sinon c'est
> les commit intermédiaires implicites qui ruinent les performances.
>
> Indépendamment de ça, effectivement envoyer beaucoup d'INSERT avec peu
> de données à chaque fois n'est pas ce qu'il y a de plus efficace, mais
> au vu de l'étape 3 ci-dessus, on ne voit pas pourquoi cette boucle FOR
> ne construit pas un seul INSERT par accumulation de VALUES, et
> l'exécute une seule fois en dehors de la boucle.  Puisque que ça
> insère toujours dans la même table et toujours avec les même colonnes
> cibles.
>
> Et une fois qu'on en est là dans le raisonnement, on peut se demander
> aussi si ça ne pourrait pas faire un COPY dans la table cible au lieu
> d'un INSERT géant, ce qui serait plus rapide aussi en permettant
> notamment un effet de pipeline entre le client et le serveur.
>
>
> Cordialement,
> --
> Daniel Vérité
>
>
>
>