Re: traitement par lots et sequence

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-11 21:46:21
Message-ID: 20190611234621.Horde.qnOJ3TDlPcrnPHAne1s0Uw3@messagerie.c-s.fr
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale


a l'heure actuelle

1 - select nextval('seq_id_mere') from generate_series(1,n); donne une
liste provisionné de n id des mères

2 - insert d'un paquet de n mére dans T_mere
insert into T_meres idMere,datamere values
((1,datam1),(2,datam2),(3,datam3), .... (n,datamn));

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.
j'ai peur que l'utilisation de CTE ne soit pas forcement bien au niveau perfo.

Thomas Boussekey <thomas(dot)boussekey(at)gmail(dot)com> a écrit :

> Bonjour Pierre,
>
> Pour la gestion des insertions dans la table fille, je passerai par:
> * une table temporaire qui accueillerait les nouveaux enregistrements à
> ajouter à la table fille (sans la valeur de séquence)
> * 2 solutions possibles:
> * un trigger positionné sur cette table temporaire avec l'option FOR
> EACH STATEMENT (en espérant qu'il voit bien la commande INSERT globale
> comme un seul statement) pour remplir la table fille en fonction des
> données de la table mère et de la table temporaire.
> * un INSERT ... SELECT en joignant les tables temporaire et mère pour
> générer l'enregistrement fils dans le bon format.
> * Ne pas oublier de bien gérer la purge de la table temporaire
>
> Sinon, est-ce qu'il est nécessaire d'avoir une séquence?
> Ou il est possible de déplacer la PK sur le champ Id_mere pour la table
> mère, auquel cas le problème de récupération de la valeur du champ
> disparaît.
>
> Thomas
>
> Le mar. 11 juin 2019 à 19:51, CRUMEYROLLE Pierre <pierre(dot)crumeyrolle(at)c-s(dot)fr>
> a écrit :
>
>> ok
>>
>> mais dans le
>> WITH ins_t_mere AS(INSERT INTO t(a,b,c) VALUES (1,'a','aa') RETURNING a)
>> > INSERT INTO t_fille SELECT a, 'b', 'bb') FROM ins_t_mere;
>> ne fait pas un traitement par lot
>>
>> merci
>>
>>
>> Anthony Nowocien <anowocien(at)gmail(dot)com> a écrit :
>>
>> > Bonjour Pierre,
>> >
>> > Peux-tu utiliser la clause RETURNING de l'INSERT?
>> >
>> > Exemple :
>> > INSERT INTO t(a,b,c) VALUES (1,'a','aa') RETURNING a;
>> >
>> > WITH ins_t_mere AS(INSERT INTO t(a,b,c) VALUES (1,'a','aa') RETURNING a)
>> > INSERT INTO t_fille SELECT a, 'b', 'bb') FROM ins_t_mere;
>> >
>> > Voir https://www.postgresql.org/docs/current/sql-insert.html
>> >
>> > Dans la partie VALUE, tu pourras peut-être aussi utiliser DEFAULT pour ta
>> > colonne d'ID.
>> >
>> > Anthony
>> >
>> > On Tuesday, June 11, 2019, CRUMEYROLLE Pierre <pierre(dot)crumeyrolle(at)c-s(dot)fr
>> >
>> > wrote:
>> >> bonjour
>> >>
>> >> probléme :
>> >>
>> >> soit 2 tables : T_meres et T_filles liées par T_meres.idMere
>> >>
>> >> je veux faire du traitement par lots pour avoir des performances car
>> gros
>> > volumes
>> >>
>> >> donc insertion par lots des T_meres sous la forme suivante
>> >>
>> >> insert into T_meres idMere,datamere values
>> > ((1,datam1),(2,datam2),(3,datam3), .... (n,datamn));
>> >>
>> >> idem insertion par lots des T_filles sous la forme suivante
>> >>
>> >> **** les n filles de la mére 1 *****
>> >>
>> >> insert into T_filles idFils,idMere,datamere values
>> > ((1,1,dataf1),(1,1,dataf2),(1,1,dataf3), .... (n,1,datafn));
>> >> insert into T_filles idFils,idMere,datamere values
>> > ((2,1,dataf1),(2,1,dataf2),(2,2,dataf3), .... (2,1,datafn));
>> >> .......
>> >> insert into T_filles idFils,idMere,datamere values
>> > ((n,1,dataf1),(n,1,dataf2),(3,1,dataf3), .... (n,1,datafn));
>> >>
>> >> **** les n filles de la mére 2 *****
>> >>
>> >> insert into T_filles idFils,idmere,datamere values
>> > ((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));
>> >> insert into T_filles idFils,idmere,datamere values
>> > ((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));
>> >> .......
>> >> insert into T_filles idFils,idmere,datamere values
>> > ((1,2,dataf1),(2,n,dataf2),(3,n,dataf3), .... (n,n,datafn));
>> >>
>> >> etc ....
>> >>
>> >> Ma question :
>> >> Comment recuperer ou provisionner la plage de sequence balayé dans
>> > l'insert des méres pour l'utiliser dans l'insert des filles dans un
>> > traitement par lots de façon la plus éfficace ?
>> >>
>> >> merci pour toute idée
>> >>
>> >>
>> >>
>>
>>
>>
>>
>>

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Marc Cousin 2019-06-12 09:15:50 Re: traitement par lots et sequence
Previous Message CRUMEYROLLE Pierre 2019-06-11 21:04:14 Re: traitement par lots et sequence