Em sáb., 28 de ago. de 2021 às 22:55, l...@laurent-hasson.com <
l...@laurent-hasson.com> escreveu:

>
>
>    >  -----Original Message-----
>    >  From: Tom Lane <t...@sss.pgh.pa.us>
>    >  Sent: Saturday, August 28, 2021 15:51
>    >  To: l...@laurent-hasson.com
>    >  Cc: Andrew Dunstan <and...@dunslane.net>; Justin Pryzby
>    >  <pry...@telsasoft.com>; Ranier Vilela <ranier...@gmail.com>; pgsql-
>    >  performa...@postgresql.org
>    >  Subject: Re: Big Performance drop of Exceptions in UDFs between V11.2
>    >  and 13.4
>    >
>    >  "l...@laurent-hasson.com" <l...@laurent-hasson.com> writes:
>    >  > SET lc_messages = 'C';
>    >  > show lc_messages; --> OK 'C'
>    >
>    >  > explain (analyze,buffers,COSTS,TIMING) select MAX(toFloat(b,
> null)) as
>    >  > "b" from sampletest ...
>    >  > Execution Time: 175.600 ms
>    >
>    >  > explain (analyze,buffers,COSTS,TIMING) select MAX(toFloat(a,
> null)) as
>    >  > "a" from sampletest ...
>    >  > Execution Time: 88031.585 ms
>    >
>    >  > Doesn't seem to make a difference unless I misunderstood what you
>    >  were asking for regarding the locale?
>    >
>    >  Hmm.  This suggests that whatever effect Andrew found with NLS is
>    >  actually not the explanation for your problem.  So I'm even more
>    >  confused than before.
>    >
>    >                    regards, tom lane
>
> I am so sorry to hear... So, curious on my end: is this something that you
> are not able to reproduce on your environments? On my end, I did reproduce
> it on different VMs and my local laptop, across windows Server 2012 and
> Windows 10, so I'd figure it would be pretty easy to reproduce?
>
What does reproduction have to do with solving the problem?
Can you tell how many commits there are between the affected versions?

I retested this case with HEAD, and it seems to me that NLS does affect it.

postgres=# create table sampletest (a varchar, b varchar);
CREATE TABLE
postgres=# insert into sampletest (a, b)
postgres-# select substr(md5(random()::text), 0, 15),
(100000000*random())::integer::varchar
postgres-#   from generate_series(1,100000);
INSERT 0 100000
postgres=#
postgres=# CREATE OR REPLACE FUNCTION toFloat(str varchar, val real)
postgres-# RETURNS real AS $$
postgres$# BEGIN
postgres$#   RETURN case when str is null then val else str::real end;
postgres$# EXCEPTION WHEN OTHERS THEN
postgres$#   RETURN val;
postgres$# END;
postgres$# $$ LANGUAGE plpgsql COST 1 IMMUTABLE;
CREATE FUNCTION
postgres=# explain (analyze,buffers,COSTS,TIMING)
postgres-# select MAX(toFloat(b, null)) as "b" from sampletest;
                                                       QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=1477.84..1477.85 rows=1 width=4) (actual
time=386.990..386.991 rows=1 loops=1)
   Buffers: shared hit=643 read=1
   ->  Seq Scan on sampletest  (cost=0.00..1197.56 rows=56056 width=32)
(actual time=0.032..17.325 rows=100000 loops=1)
         Buffers: shared hit=637
 Planning:
   Buffers: shared hit=13 read=13
 Planning Time: 0.967 ms
 Execution Time: 387.989 ms
(8 rows)


postgres=# explain (analyze,buffers,COSTS,TIMING)
postgres-# select MAX(toFloat(a, null)) as "a" from sampletest;
                                                       QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=1477.84..1477.85 rows=1 width=4) (actual
time=1812.556..1812.557 rows=1 loops=1)
   Buffers: shared hit=639 read=1
   ->  Seq Scan on sampletest  (cost=0.00..1197.56 rows=56056 width=32)
(actual time=0.026..20.866 rows=100000 loops=1)
         Buffers: shared hit=637
 Planning Time: 0.152 ms
 Execution Time: 1812.587 ms
(6 rows)


postgres=# SET lc_messages = 'C';
SET
postgres=# drop table sampletest;
DROP TABLE
postgres=# create table sampletest (a varchar, b varchar);
CREATE TABLE
postgres=# insert into sampletest (a, b)
postgres-# select substr(md5(random()::text), 0, 15),
(100000000*random())::integer::varchar
postgres-#   from generate_series(1,100000);
INSERT 0 100000
postgres=#
postgres=# CREATE OR REPLACE FUNCTION toFloat(str varchar, val real)
postgres-# RETURNS real AS $$
postgres$# BEGIN
postgres$#   RETURN case when str is null then val else str::real end;
postgres$# EXCEPTION WHEN OTHERS THEN
postgres$#   RETURN val;
postgres$# END;
postgres$# $$ LANGUAGE plpgsql COST 1 IMMUTABLE;
CREATE FUNCTION
postgres=# explain (analyze,buffers,COSTS,TIMING)
postgres-# select MAX(toFloat(b, null)) as "b" from sampletest;
                                                       QUERY PLAN
------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=1477.84..1477.85 rows=1 width=4) (actual
time=278.993..278.994 rows=1 loops=1)
   Buffers: shared hit=637
   ->  Seq Scan on sampletest  (cost=0.00..1197.56 rows=56056 width=32)
(actual time=0.029..16.837 rows=100000 loops=1)
         Buffers: shared hit=637
 Planning:
   Buffers: shared hit=4
 Planning Time: 0.181 ms
 Execution Time: 279.023 ms
(8 rows)


postgres=# explain (analyze,buffers,COSTS,TIMING)
postgres-# select MAX(toFloat(a, null)) as "a" from sampletest;
                                                       QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=2137.00..2137.01 rows=1 width=4) (actual
time=1783.434..1783.435 rows=1 loops=1)
   Buffers: shared hit=637
   ->  Seq Scan on sampletest  (cost=0.00..1637.00 rows=100000 width=15)
(actual time=0.016..21.098 rows=100000 loops=1)
         Buffers: shared hit=637
 Planning:
   Buffers: shared hit=6
 Planning Time: 1.020 ms
 Execution Time: 1783.464 ms
(8 rows)

With NLS:
Float_b:
Planning Time: 0.967 ms
Execution Time: 387.989 ms

Float_a:
Planning Time: 0.152 ms
Execution Time: 1812.587 ms

Without NLS:
Float_b:
Planning Time: 0.181 ms
Execution Time: 279.023 ms

Float_a:
Planning Time: 1.020 ms
Execution Time: 1783.464 ms

regards,
Ranier Vilela

Reply via email to