Re: [HACKERS] Speedups

From: jwieck(at)debis(dot)com (Jan Wieck)
To: vadim(at)sable(dot)krasnoyarsk(dot)su (Vadim B(dot) Mikheev)
Cc: pgsql-hackers(at)postgreSQL(dot)org (PostgreSQL HACKERS)
Subject: Re: [HACKERS] Speedups
Date: 1998-03-05 15:53:09
Message-ID: m0yAcxJ-000BFRC@orion.SAPserv.Hamburg.dsh.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


Vadim wrote:
>
> ocie(at)paracel(dot)com wrote:
> >
> > > > Not sure ofhand, but it would be useful for JDBC's PreparedStatement and
> > > > CallableStatement classes
> > >
> > > We can implement it very easy, and fast. Execution plan may be reused
> > > many times. Is this feature in standard ?
> > > What is proposed syntax if not ?
> >
> > I do see a couple sticky points:
> >
> > We would need some information about which variables are to be
> > substituted into this query plan, but this should be fairly
> > straightforward.
>
> Parser, Planner/Optimizer and Executor are able to handle parameters!
> No problems with this.

Nice discussion - especially when looking at what I initially
posted.

I assume you think about using SPI's saved plan feature for
it. Right?

>
> > Some querys may not respond well to this, for example, if a table had
> > an index on an integer field f1, this would probably be the best way
> > to satisfy a select where f1<10. But if this were in a query as f1<x,
> > then a sufficiently high value of x might make this not such a good
> > way to run the query. I haven't looked into this, but I would assume
> > that the optimizer relies on the specific values in such cases.
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Unfortunately, no!
> We have to add this feature of 'course.
> I don't know how we could deal with pre-compiled plans after this :(
> May be, we could prepare/store not single plan, but some number of
> possible plans.

That's something I thought about when I used the SPI
functions when I built PL/Tcl. Since the saved plan will be
executed via SPI_execp(), we could change some details there.
Currently SPI_prepare() and SPI_saveplan() return the plan
itself. But they could also return a little control struct
that contains the plan and other information. Since I don't
expect someone uses these plans for something else than
calling SPI_execp(), it wouldn't break anything.

SPI_execp() can do some timing calculations. For each
execution of a plan it collects the runtime in microseconds
(gettimeofday()). After the 5th or 10th call, it builds an
average and remembers that permanently. For all subsequent
calls it calculates the average time of the last 10 calls and
if that gets much higher than the initial average it wouldn't
hurt to silently prepare and save the plan again. Using
averages lowers the problem that differences in the
parameters can cause the runtime differences.

Another possible reason for the runtime differences is the
overall workload of the server. This could be very high
during the initial average calculation. So I think it could
be smart to rebuild the plan after e.g. 1000 calls ignoring
any runtimes.

>
> > We need to be able to handle changes to the structures and contents of
> > the tables. If the query plan is built and we add 10000 rows to a
> > table it references, the query should probably be recompiled. We
> > could probably do this at vacuum time. There is also a small chance
> > that a table or index that the query plan was using is dropped. We
> > could automatically rebuild the query if the table was created after
> > the query was compiled.
>
> We could mark stored plans as durty in such cases to force re-compiling
> when an application tries to use this plan.

Yep. SPI must remember all prepared and saved plans (and
forget about only prepared ones at transaction end). Things
like dropping an index or modifying a table structure cause
invalidations in the relcache, syscache and catcache (even if
another backend did it in some cases). I think it must be
possible to tell SPI from there that something happened and
which relations are affected. If a plans rangetable contains
the affected relation, the plan is marked durty.

Things like functions, operators and aggregates are also
objects that might change (drop/recreate function -> funcnode
in plan get's unusable).

I think the best would be that SPI_prepare() set's up a
collection of Oid's that cause plan invalidation in the
control structure. These are the Oid's of ALL objects
(relations, indices, functions etc.) used in the plan. Then
a call to SPI_invalidate(Oid) from the cache invalidation
handlers doesn't have to walk through the plan itself.

Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#======================================== jwieck(at)debis(dot)com (Jan Wieck) #

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 1998-03-05 16:31:58 Re: [HACKERS] alpha/64bit weirdness
Previous Message Pedro J. Lobo 1998-03-05 15:25:08 Re: [HACKERS] Re: [QUESTIONS] Problems with running v6.3 on DIGITAL UNIX (fwd)