Re: parallelisme insert/update unnest constraint
Guillaume Lelarge <[email protected]> Mon, 2 Sep 2019 15:17:00 +0200
| Newsgroups | gmane.comp.db.postgresql.french |
|---|---|
| Message-ID | <CAECtzeWFYNc5-uAKY3UXXTpdvBxS3nFvit+=ob4LJF94Mvc7Sg@mail.gmail.com> |
--000000000000331f27059191cadd
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Le lun. 2 sept. 2019 =C3=A0 14:17, CRUMEYROLLE Pierre <pierre.crumeyrolle@c=
-s.fr>
a =C3=A9crit :
>
> bonjour
>
> je tente de faire un update massif par unnest sur un table de 20
> millions de ligne,
> j'ai l'impression que le parall=C3=A9lisme n'est pas vraiment pris en
> compte dans ce cas
> les cpu sont =C3=A0 100% mais pas par alternance , pas de r=C3=A9partitio=
n
> homog=C3=A8ne de la charge cpu.
>
> les perf en insertion sont bonnes ( 10 millions de ligne en 6 minutes)
> par contre en update =C3=A7a rame .
>
> malgr=C3=A9 un postgresl.conf adapt=C3=A9 =C3=A0 une cible multi cpu (12)
> max_worker_processes =3D 12
> max_parallel_workers_per_gather =3D 6
> max_parallel_workers =3D 12
> version =3D> postgresl 11.4
>
> ma question : peut t'on faire du parall=C3=A9lisme sur de l'insert ou de
> l'update avec ou sans contraintes deffer=C3=A9es ?
> (j'ai cru comprendre que parall=C3=A9lisation =3D> multi transaction =3D>=
pas
> de constraintes )
>
> ce que je fais dans une proc stock tentative update massif par unnest
> ( mais c'est peut =C3=AAtre pas la bonne piste ? )
>
> -- pk defferable
> SET CONSTRAINTS t_test_pkey DEFERRED;
>
> UPDATE T_test SET data =3D jsonb_set(T.datanew::jsonb, '{id}',to_jsonb(
> 'provider ' || (T.id::text))) , created_at =3D T.created_at::timestamp
> FROM (select * from
> unnest(tabi) as id,
> unnest(tabp) as provider,
> unnest(tabdate) as created_at,
> unnest(tab) as datanew) T
> where T_test.id=3Dcast(T.id as int);
> COMMIT;
>
>
PostgreSQL ne parall=C3=A9lise pas les requ=C3=AAtes en =C3=A9criture (comm=
e INSERT ou
UPDATE). Le seul moyen est de parall=C3=A9liser au niveau applicatif (donc
plusieurs connexions, chacune faisant ses INSERT/UPDATE).
--=20
Guillaume.
--000000000000331f27059191cadd
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail=
_attr">Le=C2=A0lun. 2 sept. 2019 =C3=A0=C2=A014:17, CRUMEYROLLE Pierre <=
<a href=3D"mailto:[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;border-left:1px solid rgb(204,204,204);padding-le=
ft:1ex"><br>
bonjour<br>
<br>
je tente de faire un update massif par unnest sur un table de 20=C2=A0 <br>
millions de ligne,<br>
j'ai l'impression que le parall=C3=A9lisme n'est pas vraiment p=
ris en=C2=A0 <br>
compte dans ce cas<br>
les cpu sont =C3=A0 100% mais pas par alternance , pas de r=C3=A9partition=
=C2=A0 <br>
homog=C3=A8ne de la charge cpu.<br>
<br>
les perf en insertion sont bonnes ( 10 millions de ligne en 6 minutes)=C2=
=A0 <br>
par contre en update =C3=A7a rame .<br>
<br>
malgr=C3=A9 un postgresl.conf adapt=C3=A9 =C3=A0 une cible multi cpu (12)<b=
r>
max_worker_processes =3D 12<br>
max_parallel_workers_per_gather =3D 6<br>
max_parallel_workers =3D 12<br>
version =3D> postgresl 11.4<br>
<br>
ma question : peut t'on faire du parall=C3=A9lisme sur de l'insert =
ou de=C2=A0 <br>
l'update avec ou sans contraintes deffer=C3=A9es ?<br>
(j'ai cru comprendre que parall=C3=A9lisation =3D> multi transaction=
=3D> pas=C2=A0 <br>
de constraintes=C2=A0 )<br>
<br>
ce que je fais dans une proc stock tentative update massif par unnest=C2=A0=
<br>
( mais c'est peut =C3=AAtre pas la bonne piste ? )<br>
<br>
-- pk defferable<br>
SET CONSTRAINTS t_test_pkey DEFERRED;<br>
<br>
UPDATE T_test SET data =3D jsonb_set(T.datanew::jsonb, '{id}',to_js=
onb(=C2=A0 <br>
'provider ' || (T.id::text)))=C2=A0 , created_at =3D T.created_at::=
timestamp<br>
=C2=A0 =C2=A0 =C2=A0FROM (select * from<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unnest(tabi) as id,<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unnest(tabp) as provider,<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unnest(tabdate) as created_at,<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 unnest(tab) as datanew) T<br>
=C2=A0 =C2=A0 =C2=A0where T_test.id=3Dcast(T.id as int);<br>
=C2=A0 =C2=A0COMMIT;<br>
<br></blockquote><div><br></div><div>PostgreSQL ne parall=C3=A9lise pas les=
requ=C3=AAtes en =C3=A9criture (comme INSERT ou UPDATE). Le seul moyen est=
de parall=C3=A9liser au niveau applicatif (donc plusieurs connexions, chac=
une faisant ses INSERT/UPDATE).<br></div></div><div><br></div><div><br></di=
v>-- <br><div dir=3D"ltr" class=3D"gmail_signature"><div dir=3D"ltr"><div><=
div dir=3D"ltr"><div>Guillaume.<br></div></div></div></div></div></div>
--000000000000331f27059191cadd--