On 2014-08-26 22:19:47 -0400, Tom Lane wrote:
> Andres Freund <and...@2ndquadrant.com> writes:
> > The biggest concern previously were some benchmarks. I'm not entirely
> > sure where to get a good testcase for this that's not completely
> > artificial - most simpler testcases don't pin many buffers.
> 
> FWIW, I think that's by design; we don't ever want to pin more than one
> buffer per relation+index in use in a given query.

Right.

> You could certainly
> build complicated queries joining many tables in order to push up the
> number of pinned buffers, but whether buffer pin manipulations would be
> the bottleneck in such cases is pretty dubious.

Yea, I actually tried that and I didn't see anything.
 
> I would say that the issue most deserving of performance testing is your
> sizing of the linear-search array --- it's not obvious that 8 is a good
> size.

It's about the size of a cacheline on all common architectures, that's
how I found it. I don't think it makes a very big difference whether we
make it 4 or 12, but outside of that range I think it'll be unlikely to
be beneficial. The regression tests never go about three or four pins or
so currently, so I think that's a number unlikely to regularly be
crossed in practice.

> Another thing to think about: a way to get to larger numbers of pinned
> buffers without especially-complex queries is to have nested queries,
> such as SQL queries inside plpgsql functions inside outer queries.

What I did was hack together a pgbench script that does a lot of
DECLARE c_01 CURSOR FOR SELECT * FROM pg_attribute WHERE ctid = '(0, 1)';
FETCH NEXT FROM c_01;

I couldn't measure a bigger slowdown (as that has to be executed for
every xact) for the new code than for the old one.

> Does the patch logic take any advantage of the locality-of-reference
> that will occur in such scenarios?

Yes. Whenever a buffer is pinned/unpinned that's not in the array it'll
displace an entry from the array into the hashtable. Even though the
replacement is simplistic/linear I think that should nearly always end
up with the last used buffers in the array.

Greetings,

Andres Freund

-- 
 Andres Freund                     http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services


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

Reply via email to