Re: traitement par lots et sequence
Thomas Boussekey <[email protected]> Tue, 11 Jun 2019 22:42:28 +0200
| Newsgroups | gmane.comp.db.postgresql.french |
|---|---|
| Message-ID | <CALUeYmc3K1JLLnmdiuU7Dmgm1JrapeUhTg=_kit3zOZV-E+8Bw@mail.gmail.com> |
--000000000000782321058b12563d
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
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 F=
OR
EACH STATEMENT (en esp=C3=A9rant qu'il voit bien la commande INSERT globale
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 p=
our
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 tabl=
e
m=C3=A8re, auquel cas le probl=C3=A8me de r=C3=A9cup=C3=A9ration de la vale=
ur 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 <[email protected]=
r
> >
> > 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 dan=
s
> > l'insert des m=C3=A9res pour l'utiliser dans l'insert des filles dans u=
n
> > traitement par lots de fa=C3=A7on la plus =C3=A9fficace ?
> >>
> >> merci pour toute id=C3=A9e
> >>
> >>
> >>
>
>
>
>
>
--000000000000782321058b12563d
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_default" style=3D"font-family:verdana,=
sans-serif;color:#333399">Bonjour Pierre,</div><div class=3D"gmail_default"=
style=3D"font-family:verdana,sans-serif;color:#333399"><br></div><div clas=
s=3D"gmail_default" style=3D"font-family:verdana,sans-serif;color:#333399">=
Pour la gestion des insertions dans la table fille, je passerai par:</div><=
div class=3D"gmail_default" style=3D"font-family:verdana,sans-serif;color:#=
333399">* une table temporaire qui accueillerait les nouveaux enregistremen=
ts =C3=A0 ajouter =C3=A0 la table fille (sans la valeur de s=C3=A9quence)</=
div><div class=3D"gmail_default" style=3D"font-family:verdana,sans-serif;co=
lor:#333399">* 2 solutions possibles:</div><div class=3D"gmail_default" sty=
le=3D"font-family:verdana,sans-serif;color:#333399">=C2=A0 =C2=A0 * un trig=
ger positionn=C3=A9 sur cette table temporaire avec l'option FOR EACH S=
TATEMENT (en esp=C3=A9rant qu'il voit bien la commande INSERT globale c=
omme 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.</div><div class=3D"g=
mail_default" style=3D"font-family:verdana,sans-serif;color:#333399">=C2=A0=
=C2=A0 * un INSERT ... SELECT en joignant les tables temporaire et m=C3=A8=
re pour g=C3=A9n=C3=A9rer l'enregistrement fils dans le bon format.</di=
v><div class=3D"gmail_default" style=3D"font-family:verdana,sans-serif;colo=
r:#333399">* Ne pas oublier de bien g=C3=A9rer la purge de la table tempora=
ire</div><div class=3D"gmail_default" style=3D"font-family:verdana,sans-ser=
if;color:#333399"><br></div><div class=3D"gmail_default" style=3D"font-fami=
ly:verdana,sans-serif;color:#333399">Sinon, est-ce qu'il est n=C3=A9ces=
saire d'avoir une s=C3=A9quence?</div><div class=3D"gmail_default" styl=
e=3D"font-family:verdana,sans-serif;color:#333399">Ou il est possible de d=
=C3=A9placer la PK sur le champ Id_mere pour la table m=C3=A8re, auquel cas=
le probl=C3=A8me de r=C3=A9cup=C3=A9ration de la valeur du champ dispara=
=C3=AEt.</div><div class=3D"gmail_default" style=3D"font-family:verdana,san=
s-serif;color:#333399"><br></div><div class=3D"gmail_default" style=3D"font=
-family:verdana,sans-serif;color:#333399">Thomas</div></div><br><div class=
=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">Le=C2=A0mar. 11 juin=
2019 =C3=A0=C2=A019:51, CRUMEYROLLE Pierre <<a href=3D"mailto:pierre.cr=
[email protected]">[email protected]</a>> a =C3=A9crit=C2=A0:<br>=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;b=
order-left:1px solid rgb(204,204,204);padding-left:1ex">ok<br>
<br>
mais dans le<br>
WITH ins_t_mere AS(INSERT INTO t(a,b,c) VALUES (1,'a','aa')=
RETURNING a)<br>
> INSERT INTO t_fille SELECT a, 'b', 'bb') FROM ins_t_me=
re;<br>
ne fait pas un traitement par lot<br>
<br>
merci<br>
<br>
<br>
Anthony Nowocien <<a href=3D"mailto:[email protected]" target=3D"_blan=
k">[email protected]</a>> a =C3=A9crit=C2=A0:<br>
<br>
> Bonjour Pierre,<br>
><br>
> Peux-tu utiliser la clause RETURNING de l'INSERT?<br>
><br>
> Exemple :<br>
> INSERT INTO t(a,b,c) VALUES (1,'a','aa') RETURNING a;<=
br>
><br>
> WITH ins_t_mere AS(INSERT INTO t(a,b,c) VALUES (1,'a','aa&=
#39;) RETURNING a)<br>
> INSERT INTO t_fille SELECT a, 'b', 'bb') FROM ins_t_me=
re;<br>
><br>
> Voir <a href=3D"https://www.postgresql.org/docs/current/sql-insert.htm=
l" rel=3D"noreferrer" target=3D"_blank">https://www.postgresql.org/docs/cur=
rent/sql-insert.html</a><br>
><br>
> Dans la partie VALUE, tu pourras peut-=C3=AAtre aussi utiliser DEFAULT=
pour ta<br>
> colonne d'ID.<br>
><br>
> Anthony<br>
><br>
> On Tuesday, June 11, 2019, CRUMEYROLLE Pierre <<a href=3D"mailto:pi=
[email protected]" target=3D"_blank">[email protected]</a>>=
;<br>
> wrote:<br>
>> bonjour<br>
>><br>
>> probl=C3=A9me :<br>
>><br>
>> soit 2 tables : T_meres et T_filles li=C3=A9es par=C2=A0 T_meres.i=
dMere<br>
>><br>
>> je veux faire du traitement par lots pour avoir des performances c=
ar gros<br>
> volumes<br>
>><br>
>> donc insertion par lots des T_meres sous la forme suivante<br>
>><br>
>> insert into T_meres idMere,datamere values<br>
> ((1,datam1),(2,datam2),(3,datam3), .... (n,datamn));<br>
>><br>
>> idem insertion par lots des T_filles sous la forme suivante<br>
>><br>
>> **** les n filles de la m=C3=A9re 1 *****<br>
>><br>
>> insert into T_filles idFils,idMere,datamere values<br>
> ((1,1,dataf1),(1,1,dataf2),(1,1,dataf3), .... (n,1,datafn));<br>
>> insert into T_filles idFils,idMere,datamere values<br>
> ((2,1,dataf1),(2,1,dataf2),(2,2,dataf3), .... (2,1,datafn));<br>
>> .......<br>
>> insert into T_filles idFils,idMere,datamere values<br>
> ((n,1,dataf1),(n,1,dataf2),(3,1,dataf3), .... (n,1,datafn));<br>
>><br>
>> **** les n filles de la m=C3=A9re 2 *****<br>
>><br>
>> insert into T_filles idFils,idmere,datamere values<br>
> ((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));<br>
>> insert into T_filles idFils,idmere,datamere values<br>
> ((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));<br>
>> .......<br>
>> insert into T_filles idFils,idmere,datamere values<br>
> ((1,2,dataf1),(2,n,dataf2),(3,n,dataf3), .... (n,n,datafn));<br>
>><br>
>> etc ....<br>
>><br>
>> Ma question :<br>
>> Comment recuperer ou provisionner la plage de sequence balay=C3=A9=
dans<br>
> l'insert des m=C3=A9res pour l'utiliser dans l'insert des =
filles dans un<br>
> traitement par lots=C2=A0 de fa=C3=A7on la plus =C3=A9fficace ?<br>
>><br>
>> merci pour toute id=C3=A9e<br>
>><br>
>><br>
>><br>
<br>
<br>
<br>
<br>
</blockquote></div>
--000000000000782321058b12563d--