Thread: [BUGS] BUG #14525: select .* takes extremely long time

[BUGS] BUG #14525: select .* takes extremely long time

From
martin.langwisch@gmx.net
Date:
The following bug has been logged on the website:

Bug reference:      14525
Logged by:          Martin Langwisch
Email address:      martin.langwisch@gmx.net
PostgreSQL version: 9.6.1
Operating system:   openSUSE 11.4 (x86_64)
Description:

I have a function f that returns a composite type.
The following query:
select f().*
takes about ten times as long as either
select f()
or
select (f).* from (select f() as f) a;

It doesn't matter whether the function returns a composite type or a set of
composite type.

This behaviour strikes me as odd, to say the least and it took me quite some
time to find out why my code was so slow.

yours
Martin


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

Re: [BUGS] BUG #14525: select .* takes extremely long time

From
Pavel Stehule
Date:
Hi

2017-02-02 10:05 GMT+01:00 <martin.langwisch@gmx.net>:
The following bug has been logged on the website:

Bug reference:      14525
Logged by:          Martin Langwisch
Email address:      martin.langwisch@gmx.net
PostgreSQL version: 9.6.1
Operating system:   openSUSE 11.4 (x86_64)
Description:

I have a function f that returns a composite type.
The following query:
select f().*
takes about ten times as long as either
select f()
or
select (f).* from (select f() as f) a;

It doesn't matter whether the function returns a composite type or a set of
composite type.

This behaviour strikes me as odd, to say the least and it took me quite some
time to find out why my code was so slow.

Although it looks strange - it is expected behave - and it is not a bug

XT is a composite type (a, b, c)

fx is a function with XT result.

SELECT (fx()).* is translated by parser to query SELECT fx().a, fx().b, fx().c ....

When your function fx is slow, then you cannot to use a (fx()).* pattern

Regards

Pavel

 

yours
Martin


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

Re: [BUGS] BUG #14525: select .* takes extremely long time

From
Tom Lane
Date:
Pavel Stehule <pavel.stehule@gmail.com> writes:
> 2017-02-02 10:05 GMT+01:00 <martin.langwisch@gmx.net>:
>> I have a function f that returns a composite type.
>> The following query:
>> select f().*
>> takes about ten times as long as either
>> select f()
>> or
>> select (f).* from (select f() as f) a;

> SELECT (fx()).* is translated by parser to query SELECT fx().a, fx().b,
> fx().c ....

> When your function fx is slow, then you cannot to use a (fx()).* pattern

Yeah.  Putting the function in FROM is the recommended fix.  You can
simplify the pattern to

    select f.* from f() as f

or if the function needs arguments from a table,

    select f.* from tab, lateral f(x,y) as f

            regards, tom lane


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