BUG #5113: Postgres not scanning indexes
The following bug has been logged online:
Bug reference: 5113
Logged by: dan
Email address: dan.boeriu@roost.com
PostgreSQL version: 8.4.1
Operating system: redhat 5.3
Description: Postgres not scanning indexes
Details:
Let's say I have a table t with 5 columns c1 NOT NULL, c2 NOT NULL, c3, c4,
c5
and I have a UNIQUE index on (c1, c2) (remember c1 and c2 have a not null
constraint)
When I run the query:
select c1,c2 from t
I expect the explain to say index scan; instead it says table scan.
The index has ALL the info I need and in my case is about 2% the size of the
table. Why is Postgres still choosing to do a full table scan? The same
applies to a primary key - if (c1, c2) is the primary key then I expect:
select c1,c2 from t
to scan only the index - instead it scans the table
On Oct 13, 2009, at 18:46 , dan wrote:
When I run the query:
select c1,c2 from tI expect the explain to say index scan; instead it says table scan.
You're asking for the entire table: why perform the extra work of
using an index and then looking up entries in the table rather than
reading from the table directly? Compare trying to read an entire book
by looking up individual words in the index and then turning to the
appropriate page.
Michael Glaesemann
grzm seespotcode net
On Tue, 13 Oct 2009, dan wrote:
Let's say I have a table t with 5 columns c1 NOT NULL, c2 NOT NULL, c3, c4,
c5
and I have a UNIQUE index on (c1, c2) (remember c1 and c2 have a not null
constraint)When I run the query:
select c1,c2 from tI expect the explain to say index scan; instead it says table scan.
The index has ALL the info I need and in my case is about 2% the size of the
table.
The index is missing the visibility information, so right now the system
cannot run such a query over the index alone since it couldn't determine
if the row version is visible to your statement. That data is currently in
with the data in the table, so it ends up needing to go back and read the
rows from the main table. IIRC, there's been talk and some work around
supporting indexes with visibility info, but I think there might have been
some issues that needed to be worked out before that would work.
"dan" == "dan" <dan.boeriu@roost.com> writes:
dan> I expect the explain to say index scan; instead it says table scan.
dan> The index has ALL the info I need
It may have all the info _you_ need, but what it doesn't have is all the
info that _postgres_ needs; specifically it doesn't contain enough row
visibility info for index-only scans to be possible without consulting
the table.
--
Andrew (irc:RhodiumToad)