Vous n'êtes pas identifié(e).

#1 Re : Général » SELECT FOR UPDATE : problème de performance entre 8.4 et 9.3 » 02/12/2014 03:47:58

Finalement, fausse joie !
Les derniers tests n'étaient pas probants, notamment concernant la perte exponentielle que nous ne constations plus.
En effet, nous n'avions plus, dans notre jeu de test, de ligne concernée par le select for update (sic)

Le problème reste donc entier.

#2 Re : Général » SELECT FOR UPDATE : problème de performance entre 8.4 et 9.3 » 01/12/2014 17:47:18

De mon côté, en utilisant le même code que vous (et les mêmes tables)

8.4 :
--27 550
--36 318
--32 589
--33 010
--38 720
--56 379
--43 696
--28 704
--29 031
--34 710

9.3 :
--53 758
--44 179
--39 110
--37 503
--51 059
--68 345
--62 526
--41 372
--43 275

Je ne suis pas sur que l'on puisse en tirer quoi que ce soit. Éventuellement que cela est quand-même plus long en 9.3.


Ceci étant dit, nous avons trouvé l'explication à la dégradation exponentielle que nous constations en 9.3. Il s'agissait d'une différence entre les deux postgres.conf

Bref, pour conclure sur la batterie de tests du jour :
- la 9.3 reste plus lente sur la gestion de slock explicite
- la dégradation exponentielle se corrige via "bon" paramétrage du postgres.conf

#3 Re : Général » SELECT FOR UPDATE : problème de performance entre 8.4 et 9.3 » 01/12/2014 11:19:01

Bonjour, et merci pour cette réponse,

La déperdition se manifeste avec une nombre d'itérations > 1000, voire > 10 000. La déperdition semble alors exponentielle.

Voici le code utilisé, et exécuté directement via pgadmin, sur une base identique 8.4 et 9.3.
La procédure est lancée via un "select * from jpi_test_perf_chronos()" tout simple
A noter que les tables etablissement et  param_chrono contiennent moins de 50 enreg :

---------------------------------------------------------

CREATE OR REPLACE FUNCTION jpi_test_perf_chronos()
  RETURNS VOID AS
$BODY$
DECLARE
  x INTEGER := 0;
  y INTEGER;

 
BEGIN

  LOOP
       select 1 from param_chrono into y where chron_table = 'facture' for UPDATE;


    select 1 into y from etablissement limit 1;

   
    update param_chrono set chron_chrono = chron_chrono where chron_table = 'facture';

    x := x +1 ;
   
    IF x >= 9999 THEN 
        EXIT;
     END iF ;
   
  END LOOP;

RETURN;

END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
------------------------------------------------------------------------------

En 8.4 =>  4300 ms
En 9.3 =>  19 500 ms   (...)

#4 Général » SELECT FOR UPDATE : problème de performance entre 8.4 et 9.3 » 29/11/2014 10:20:14

krile
Réponses : 11

Bonjour

Nous constatons une déperdition importante de performance entre la 8.4 et la 9.3 sur le lock explicite

Nous travaillons sur une table nommée "chrono" pour l'exemple, qui contient moins de 50 lignes

Le code concerné est le suivant :
-----------------------------------------------------
begin
for 1 to 1000
    select * from chrono  where [where_condition] FOR UPDATE
    do stuff (or not…..)
    update chrono set [set_clause] where [where_condition]
end for
commit
--------------------------------------------------------
En 8.4, no problem: le temps de chaque boucle reste homogène, du début à la fin.
En 9.3, il y a une déperdition exponentielle !

Nos tests montrent qu'une façon "simple" de résoudre le problème serait de faire un commit après chaque update de chrono, afin de "libréer" le lock.
Mais, mais, mais: faire cela a d'énormes conséquences par ailleurs, sur notre application (pour faire simple, une réécriture très lourde, chronophage et impactante)

Une idée ou une explication ?

Merci

Pied de page des forums

Propulsé par FluxBB