Re: parallelisme insert/update unnest constraint

CRUMEYROLLE Pierre <[email protected]> Mon, 02 Sep 2019 17:51:07 +0200
Newsgroups gmane.comp.db.postgresql.french
Message-ID <[email protected]>
je cherche =C3=A0 benchmarker les perfo de postgresql  sur du chargement=20=
=20
massive=20par lots via unnest mais avec du jsonb
en 6 minutes je lui fait avaler 20 millions de lignes  33G de jsonb
procedure stock=C3=A9e + unnest  table simple id date jsonb



Anthony Nowocien <[email protected]> a =C3=A9crit=C2=A0:

> Bonjour,
>
> J'ai eu un batch de 40 000 000 INSERTs =C3=A0 faire sur un serveur =C3=A0=
 12CPU -
> donc un traitement assez proche du tien - et parall=C3=A9liser sur plusie=
urs
> sessions a permis de passer le temps de 130m =C3=A0 18m. Apr=C3=A8s il va=
ut mieux
> laisser un peu de CPUs libres pour le reste des process PG... Cela devrai=
t
> =C3=AAtre similaire pour des UPDATE (peut =C3=AAtre difficile =C3=A0 s=C3=
=A9parer dans ton
> cas?).
>
> Anthony
>
>
> On Mon, Sep 2, 2019, 15:22 Guillaume Lelarge <[email protected]> wro=
te:
>
>> Le lun. 2 sept. 2019 =C3=A0 14:17, CRUMEYROLLE Pierre <
>> [email protected]> 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=A9partit=
ion
>>> 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 (1=
2)
>>> 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 d=
e
>>> 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 (c=
omme INSERT ou
>> UPDATE). Le seul moyen est de parall=C3=A9liser au niveau applicatif (do=
nc
>> plusieurs connexions, chacune faisant ses INSERT/UPDATE).
>>
>>
>> --
>> Guillaume.
>>