From: | Heikki Linnakangas <hlinnakangas(at)vmware(dot)com> |
---|---|
To: | M Putz <puma(at)c007(dot)de> |
Cc: | pgsql-performance(at)postgresql(dot)org |
Subject: | Re: Strange performance boost with random() |
Date: | 2014-02-10 20:03:36 |
Message-ID: | 52F93098.2090002@vmware.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
On 02/10/2014 09:52 PM, M Putz wrote:
>
> Hello,
>
> While analyzing performance, we encountered the following phenomenon,
>
> SELECT sum(pow(.5*generate_series,.5))
> FROM generate_series(1,1000000);
>
> is much much (a hundred times) slower than
>
> SELECT sum(pow(random()*generate_series,.5))
> FROM generate_series(1,1000000);
>
> and asymptotic difference is even more astounding.
> This seems counter-intuitive, considering the cost of
> an additional random() call instead of a constant factor.
> What are the reasons for this strange performance boost?
Different data type. The first uses numeric, which is pretty slow for
doing calculations. random() returns a double, which makes the pow and
sum to also use double, which is a lot faster.
To see the effect, try these variants:
SELECT sum(pow(.5::float8 * generate_series,.5))
FROM generate_series(1,1000000);
SELECT sum(pow(random()::numeric * generate_series,.5))
FROM generate_series(1,1000000);
- Heikki
From | Date | Subject | |
---|---|---|---|
Next Message | Sébastien Lorion | 2014-02-11 15:21:30 | Re: Strange performance boost with random() |
Previous Message | M Putz | 2014-02-10 19:52:51 | Strange performance boost with random() |