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&#39;option FOR EACH S=
TATEMENT (en esp=C3=A9rant qu&#39;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&#39;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&#39;il est n=C3=A9ces=
saire d&#39;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 &lt;<a href=3D"mailto:pierre.cr=
[email protected]">[email protected]</a>&gt; 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,&#39;a&#39;,&#39;aa&#39;)=
 RETURNING a)<br>
&gt; INSERT INTO t_fille SELECT a, &#39;b&#39;, &#39;bb&#39;) FROM ins_t_me=
re;<br>
ne fait pas un traitement par lot<br>
<br>
merci<br>
<br>
<br>
Anthony Nowocien &lt;<a href=3D"mailto:[email protected]" target=3D"_blan=
k">[email protected]</a>&gt; a =C3=A9crit=C2=A0:<br>
<br>
&gt; Bonjour Pierre,<br>
&gt;<br>
&gt; Peux-tu utiliser la clause RETURNING de l&#39;INSERT?<br>
&gt;<br>
&gt; Exemple :<br>
&gt; INSERT INTO t(a,b,c) VALUES (1,&#39;a&#39;,&#39;aa&#39;) RETURNING a;<=
br>
&gt;<br>
&gt; WITH ins_t_mere AS(INSERT INTO t(a,b,c) VALUES (1,&#39;a&#39;,&#39;aa&=
#39;) RETURNING a)<br>
&gt; INSERT INTO t_fille SELECT a, &#39;b&#39;, &#39;bb&#39;) FROM ins_t_me=
re;<br>
&gt;<br>
&gt; 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>
&gt;<br>
&gt; Dans la partie VALUE, tu pourras peut-=C3=AAtre aussi utiliser DEFAULT=
 pour ta<br>
&gt; colonne d&#39;ID.<br>
&gt;<br>
&gt; Anthony<br>
&gt;<br>
&gt; On Tuesday, June 11, 2019, CRUMEYROLLE Pierre &lt;<a href=3D"mailto:pi=
[email protected]" target=3D"_blank">[email protected]</a>&gt=
;<br>
&gt; wrote:<br>
&gt;&gt; bonjour<br>
&gt;&gt;<br>
&gt;&gt; probl=C3=A9me :<br>
&gt;&gt;<br>
&gt;&gt; soit 2 tables : T_meres et T_filles li=C3=A9es par=C2=A0 T_meres.i=
dMere<br>
&gt;&gt;<br>
&gt;&gt; je veux faire du traitement par lots pour avoir des performances c=
ar gros<br>
&gt; volumes<br>
&gt;&gt;<br>
&gt;&gt; donc insertion par lots des T_meres sous la forme suivante<br>
&gt;&gt;<br>
&gt;&gt; insert into T_meres idMere,datamere values<br>
&gt; ((1,datam1),(2,datam2),(3,datam3), .... (n,datamn));<br>
&gt;&gt;<br>
&gt;&gt; idem insertion par lots des T_filles sous la forme suivante<br>
&gt;&gt;<br>
&gt;&gt; **** les n filles de la m=C3=A9re 1 *****<br>
&gt;&gt;<br>
&gt;&gt; insert into T_filles idFils,idMere,datamere values<br>
&gt; ((1,1,dataf1),(1,1,dataf2),(1,1,dataf3), .... (n,1,datafn));<br>
&gt;&gt; insert into T_filles idFils,idMere,datamere values<br>
&gt; ((2,1,dataf1),(2,1,dataf2),(2,2,dataf3), .... (2,1,datafn));<br>
&gt;&gt; .......<br>
&gt;&gt; insert into T_filles idFils,idMere,datamere values<br>
&gt; ((n,1,dataf1),(n,1,dataf2),(3,1,dataf3), .... (n,1,datafn));<br>
&gt;&gt;<br>
&gt;&gt; **** les n filles de la m=C3=A9re 2 *****<br>
&gt;&gt;<br>
&gt;&gt; insert into T_filles idFils,idmere,datamere values<br>
&gt; ((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));<br>
&gt;&gt; insert into T_filles idFils,idmere,datamere values<br>
&gt; ((1,2,dataf1),(2,2,dataf2),(3,2,dataf3), .... (n,2,datafn));<br>
&gt;&gt; .......<br>
&gt;&gt; insert into T_filles idFils,idmere,datamere values<br>
&gt; ((1,2,dataf1),(2,n,dataf2),(3,n,dataf3), .... (n,n,datafn));<br>
&gt;&gt;<br>
&gt;&gt; etc ....<br>
&gt;&gt;<br>
&gt;&gt; Ma question :<br>
&gt;&gt; Comment recuperer ou provisionner la plage de sequence balay=C3=A9=
 dans<br>
&gt; l&#39;insert des m=C3=A9res pour l&#39;utiliser dans l&#39;insert des =
filles dans un<br>
&gt; traitement par lots=C2=A0 de fa=C3=A7on la plus =C3=A9fficace ?<br>
&gt;&gt;<br>
&gt;&gt; merci pour toute id=C3=A9e<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
<br>
<br>
<br>
<br>
</blockquote></div>

--000000000000782321058b12563d--