| From: | CRUMEYROLLE Pierre <pierre(dot)crumeyrolle(at)c-s(dot)fr> |
|---|---|
| To: | pgsql-fr-generale(at)lists(dot)postgresql(dot)org |
| Subject: | Re: traitement par lots et sequence |
| Date: | 2019-06-12 12:25:08 |
| Message-ID: | 20190612142508.Horde.75TGlVj7BKoPC24ZzJe_yg4@messagerie.c-s.fr |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-fr-generale |
ok pour la demarche
malheureusement j'adapte un code déja ecrit en java hibernate jpa , je
sui pas dans le cadre d'un simple script
merci
Emmanuel BEZAGU <emmanuel(dot)bezagu(at)dgfip(dot)finances(dot)gouv(dot)fr> a écrit :
> 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é
>>
>>
>>
>>
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Daniel Verite | 2019-06-12 13:45:23 | Re: traitement par lots et sequence |
| Previous Message | CRUMEYROLLE Pierre | 2019-06-12 12:23:14 | Re: traitement par lots et sequence |