Thread: Update

Update

From
Kyle
Date:
OK, I figured it out.  It wasn't the sum(int4) thing...

I have a query that looks like this:

select pnum from part where func1(pnum) and func2(pnum);

Func1 takes less time to execute than func2.  I was using func1 to
"narrow the field" of records so the query would not take so long to
execute.  After upgrading to 7.1 the query got real slow.  After
changing the query to:

select pnum from part where func2(pnum) and func1(pnum);

The query went back to its normal time.

It appears that the first function would get evaluated first under 7.0.3
but the last function gets evaluated first under 7.1.  Is that accurate?

Is there a way to control which functions are given precidence?

Kyle


Attachment

Re: Update

From
Tom Lane
Date:
Kyle <kyle@Actarg.com> writes:
> It appears that the first function would get evaluated first under 7.0.3
> but the last function gets evaluated first under 7.1.  Is that accurate?

Actually, I was under the impression that (all else being equal) WHERE
clauses would get evaluated right-to-left in 7.0.* as well.  I was
meaning to figure out where the clause order reversal is happening and
undo it, but didn't get around to it for 7.1.

> Is there a way to control which functions are given precidence?

Nope, not at the moment.  The code has remnants of a notion of cost of
evaluation for functions, but it's not being used for anything ...
        regards, tom lane


Re: Update

From
Kyle
Date:
Tom Lane wrote:

> Kyle <kyle@Actarg.com> writes:
> > It appears that the first function would get evaluated first under 7.0.3
> > but the last function gets evaluated first under 7.1.  Is that accurate?
>
> Actually, I was under the impression that (all else being equal) WHERE
> clauses would get evaluated right-to-left in 7.0.* as well.  I was
> meaning to figure out where the clause order reversal is happening and
> undo it, but didn't get around to it for 7.1.
>
> > Is there a way to control which functions are given precidence?
>
> Nope, not at the moment.  The code has remnants of a notion of cost of
> evaluation for functions, but it's not being used for anything ...
>

Might be interesting to have something like:

create function ... as ... with cost=x;

It would also be cool to supply a default set of parameters to the function.
Then "vaccum analyze" or some such thing could execute the functions, time
them, and store cost data internally...

create function ... as ... with default(3,7,4);
or
create function myfunc (int4 3, float8 7, numeric 4) ...;

BTW, great job on 7.1!  Kudos to all the developers who are working so hard
to make it happen.


Attachment