| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
|---|---|
| To: | Alexey Bashtanov <bashtanov(at)imap(dot)cc> |
| Cc: | pgsql-bugs(at)postgresql(dot)org |
| Subject: | Re: index scan is performed when index-only scan is possible (partial index) |
| Date: | 2014-02-10 16:04:36 |
| Message-ID: | 11283.1392048276@sss.pgh.pa.us |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-bugs |
Alexey Bashtanov <bashtanov(at)imap(dot)cc> writes:
>>> create table t as select a, a % 2 b, a % 2 c from generate_series(1,
> 1000000) a order by random();
> SELECT 1000000
>>> create index t_i1 on t (a, c) where b = 1;
> CREATE INDEX
>>> EXPLAIN select a from t where a < 10000 and b = 1 order by a;
> [ doesn't do index-only scan ]
Yeah, see the comment in check_index_only():
/*
* Check that all needed attributes of the relation are available from the
* index.
*
* XXX this is overly conservative for partial indexes, since we will
* consider attributes involved in the index predicate as required even
* though the predicate won't need to be checked at runtime. (The same is
* true for attributes used only in index quals, if we are certain that
* the index is not lossy.) However, it would be quite expensive to
* determine that accurately at this point, so for now we take the easy
* way out.
*/
This code knows that b is referenced in the query, which would ordinarily
defeat using an index-only scan with this index. There's no very good way
to tell that the only such reference is in a qual that we will later
decide doesn't need to be checked at runtime.
So, yeah, it'd be nice if that worked ... but don't hold your breath.
regards, tom lane
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Jeff Janes | 2014-02-10 16:16:02 | Re: BUG #9142: Bug installing "Database Cluster Initialisation Failed" |
| Previous Message | Tom Lane | 2014-02-10 15:50:56 | Re: BUG #9175: REINDEX on functional index fails |