Re: Strange performance boost with random() - Mailing list pgsql-performance

From Sébastien Lorion
Subject Re: Strange performance boost with random()
Date
Msg-id CAGa5y0MNo7r3HdnZMTa+a+W+d14kbRNO-+REyYSMRd9q_XHw1g@mail.gmail.com
Whole thread Raw
In response to Re: Strange performance boost with random()  (Heikki Linnakangas <hlinnakangas@vmware.com>)
Responses Re: Strange performance boost with random()  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-performance
On Mon, Feb 10, 2014 at 3:03 PM, Heikki Linnakangas <hlinnakangas@vmware.com> wrote:
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



--
Sent via pgsql-performance mailing list (pgsql-performance@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance

That's interesting .. Does PostgreSQL always use the NUMERIC data type for constants in absence of cast ?

Sébastien

pgsql-performance by date:

Previous
From: Heikki Linnakangas
Date:
Subject: Re: Strange performance boost with random()
Next
From: Tom Lane
Date:
Subject: Re: Strange performance boost with random()