Re: traitement par lots et sequence

CRUMEYROLLE Pierre <[email protected]> Tue, 11 Jun 2019 23:46:21 +0200
Newsgroups gmane.comp.db.postgresql.french
Message-ID <[email protected]>
a l'heure actuelle

1 - select nextval('seq_id_mere') from generate_series(1,n); donne une=20=
=20
=20 liste provisionn=C3=A9  de n  id des m=C3=A8res

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

3 -  boucle sur tous les id de m=C3=A8re
for i in liste_id_mere
{
    insertion d'un  paquet de j  filles pour une m=C3=A8re
    insert into T_filles idFils,idMere,datamere values=20=20
((j,i,dataf1),(j,i,dataf2),(j,i,dataf3),=20.... (j,i,datafn));
     }
}

je suis oblig=C3=A9 de faire de  l'insert par batch  car l'insertion=20=20
unitaire=20postgresql n'est pas top , seul le traitement par lots donne=20=
=20
des=20perfs convenables.
j'ai peur que l'utilisation de CTE ne soit pas forcement bien au niveau per=
fo.


Thomas Boussekey <[email protected]> a =C3=A9crit=C2=A0:

> Bonjour Pierre,
>
> Pour la gestion des insertions dans la table fille, je passerai par:
> * une table temporaire qui accueillerait les nouveaux enregistrements =C3=
=A0
> ajouter =C3=A0 la table fille (sans la valeur de s=C3=A9quence)
> * 2 solutions possibles:
>     * un trigger positionn=C3=A9 sur cette table temporaire avec l'option=
 FOR
> EACH STATEMENT (en esp=C3=A9rant qu'il voit bien la commande INSERT globa=
le
> comme un seul statement) pour remplir la table fille en fonction des
> donn=C3=A9es de la table m=C3=A8re et de la table temporaire.
>     * un INSERT ... SELECT en joignant les tables temporaire et m=C3=A8re=
 pour
> g=C3=A9n=C3=A9rer l'enregistrement fils dans le bon format.
> * Ne pas oublier de bien g=C3=A9rer la purge de la table temporaire
>
> Sinon, est-ce qu'il est n=C3=A9cessaire d'avoir une s=C3=A9quence?
> Ou il est possible de d=C3=A9placer la PK sur le champ Id_mere pour la ta=
ble
> m=C3=A8re, auquel cas le probl=C3=A8me de r=C3=A9cup=C3=A9ration de la va=
leur du champ
> dispara=C3=AEt.
>
> Thomas
>
> Le mar. 11 juin 2019 =C3=A0 19:51, CRUMEYROLLE Pierre <pierre.crumeyrolle=
@c-s.fr>
> a =C3=A9crit :
>
>> 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 <[email protected]> a =C3=A9crit :
>>
>> > 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-=C3=AAtre aussi utiliser DEFAULT=
 pour ta
>> > colonne d'ID.
>> >
>> > Anthony
>> >
>> > On Tuesday, June 11, 2019, CRUMEYROLLE Pierre <pierre.crumeyrolle@c-s.=
fr
>> >
>> > wrote:
>> >> bonjour
>> >>
>> >> probl=C3=A9me :
>> >>
>> >> soit 2 tables : T_meres et T_filles li=C3=A9es 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=C3=A9re 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=C3=A9re 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=C3=A9 da=
ns
>> > l'insert des m=C3=A9res pour l'utiliser dans l'insert des filles dans =
un
>> > traitement par lots  de fa=C3=A7on la plus =C3=A9fficace ?
>> >>
>> >> merci pour toute id=C3=A9e
>> >>
>> >>
>> >>
>>
>>
>>
>>
>>