Re: Use of additional index columns in rows filtering

From: Jeff Davis <pgsql(at)j-davis(dot)com>
To: Tomas Vondra <tomas(dot)vondra(at)enterprisedb(dot)com>, James Coleman <jtc331(at)gmail(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Maxim Ivanov <hi(at)yamlcoder(dot)me>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>, Andres Freund <andres(at)anarazel(dot)de>, Peter Geoghegan <pg(at)bowt(dot)ie>
Subject: Re: Use of additional index columns in rows filtering
Date: 2023-07-18 23:22:17
Message-ID: ab8dd095b22f770b7b870f531fb2694991c6c2c5.camel@j-davis.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, 2023-07-19 at 00:36 +0200, Tomas Vondra wrote:
> > * I'm confused about the relationship of an IOS to an index filter.
> > It
> > seems like the index filter only works for an ordinary index scan?
> > Why
> > is that?
>
> What would it do for IOS?

The way it's presented is slightly confusing. If you have table x with
and index on column i, then:

EXPLAIN (ANALYZE, BUFFERS)
SELECT i, j FROM x WHERE i = 7 and (i % 1000 = 7);

Index Scan using x_idx on x (cost=0.42..8.45 rows=1 width=8)
(actual time=0.094..0.098 rows=1 loops=1)
Index Cond: (i = 7)
Index Filter: ((i % 1000) = 7)

But if you remove "j" from the target list, you get:

EXPLAIN (ANALYZE, BUFFERS)
SELECT i FROM x WHERE i = 7 and (i % 1000 = 7);

Index Only Scan using x_idx on x (cost=0.42..4.45 rows=1 width=4)
(actual time=0.085..0.088 rows=1 loops=1)
Index Cond: (i = 7)
Filter: ((i % 1000) = 7)

The confused me at first because the "Filter" in the second plan means
the same thing as the "Index Filter" in the first plan. Should we call
the filter in an IOS an "Index Filter" too? Or is that redundant?

Regards,
Jeff Davis

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Fujii.Yuki@df.MitsubishiElectric.co.jp 2023-07-19 00:43:38 RE: Partial aggregates pushdown
Previous Message Thomas Munro 2023-07-18 23:03:53 Re: [PoC] Federated Authn/z with OAUTHBEARER