Robert Haas <robertmhaas@gmail.com> writes:
> Not really. We have detected a small performance regression when both
> heap and index fit in shared_buffers and an index-only scan is used.
> I have a couple of ideas for improving this. One is to store a
> virtual tuple into the slot instead of building a regular tuple, but
> what do we do about tuples with OIDs?
Yeah, I was just looking at that. I think it's going to be a clear win
to use a virtual tuple slot instead of constructing and deconstructing
a HeapTuple. The obvious solution is to decree that you can't use an
index-only scan if the query requires fetching OID (or any other system
column). This would be slightly annoying for catalog fetches but I'm
not sure I believe that catalog queries are that important a use-case.
I was also toying with the notion of pushing the slot fill-in into the
AM, so that the AM API is to return a filled TupleSlot not an
IndexTuple. This would not save any cycles AFAICT --- at least in
btree, we still have to make a palloc'd copy of the IndexTuple so that
we can release lock on the index page. The point of it would be to
avoid the assumption that the index's internal storage has exactly the
format of IndexTuple. Don't know whether we'd ever have any actual use
for that flexibility, but it seems like it wouldn't cost much to
preserve the option.
> Another is to avoid locking the
> index buffer multiple times - right now it locks the index buffer to
> get the TID, and then relocks it to extract the index tuple (after
> checking that nothing disturbing has happened meanwhile). It seems
> likely that with some refactoring we could get this down to a single
> lock/unlock cycle, but I haven't figured out exactly where the TID
> gets copied out.
Yeah, maybe, but let's get the patch committed before we start looking
for second-order optimizations.
> With regard to the AM API, the basic idea is we're just adding a
> Boolean to say whether the AM is capable of returning index tuples.
> If it's not, then we don't ever try an index-only scan. If it is,
> then we'll set the want_index_tuple flag if an index-only scan is
> possible. This requests that the AM attempt to return the tuple; but
> the AM is also allowed to fail and not return the tuple whenever it
> wants.
It was the "allowed to fail" bit that I was annoyed to discover only by
reading some well-buried code.
> Incidentally, if you happen to feel the urge to beat this around and
> send it back rather than posting a list of requested changes, feel
> free.
You can count on that ;-). I've already found a lot of things I didn't
care for.
regards, tom lane