From: | Peter Geoghegan <pg(at)bowt(dot)ie> |
---|---|
To: | Tomas Vondra <tomas(dot)vondra(at)enterprisedb(dot)com> |
Cc: | Jeff Davis <pgsql(at)j-davis(dot)com>, James Coleman <jtc331(at)gmail(dot)com>, 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>, Konstantin Knizhnik <knizhnik(at)garret(dot)ru>, markus(dot)winand(at)winand(dot)at |
Subject: | Re: Use of additional index columns in rows filtering |
Date: | 2023-08-08 04:21:06 |
Message-ID: | CAH2-WznERPP_ub8SLKe6rMTAuRgu1N-FXt-NF4qSj2G36b1ShQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Mon, Aug 7, 2023 at 3:18 PM Peter Geoghegan <pg(at)bowt(dot)ie> wrote:
> Even my patch cannot always make SAOP clauses into index quals. There
> are specific remaining gaps that I hope that your patch will still
> cover. The simplest example is a similar NOT IN() inequality, like
> this:
>
> select
> ctid, *
> from
> tenk1
> where
> thousand = 42
> and
> tenthous not in (1, 3, 42, 43, 44, 45, 46, 47, 48, 49, 50);
>
> There is no way that my patch can handle this case. Where your patch
> seems to be unable to do better than master here, either -- just like
> with the "tenthous in ( )" variant. Once again, the inequality SAOP
> also ends up as table filter quals, not index filter quals.
>
> It would also be nice if we found a way of doing this, while still
> reliably avoiding all visibility checks (just like "real index quals"
> will) -- since that should be safe in this specific case.
Actually, this isn't limited to SAOP inequalities. It appears as if
*any* simple inequality has the same limitation. So, for example, the
following query can only use table filters with the patch (never index
filters):
select
ctid, *
from
tenk1
where
thousand = 42 and tenthous != 1;
This variant will use index filters, as expected (though with some
risk of heap accesses when VM bits aren't set):
select
ctid, *
from
tenk1
where
thousand = 42 and tenthous is distinct from 1;
Offhand I suspect that it's a similar issue to the one you described for SAOPs.
I see that get_op_btree_interpretation() will treat != as a kind of
honorary member of an opfamily whose = operator has our != operator as
its negator. Perhaps we should be finding a way to pass != quals into
the index AM so that they become true index quals (obviously they
would only be index filter predicates, never access predicates). That
has the advantage of working in a way that's analogous to the way that
index quals already avoid visibility checks.
--
Peter Geoghegan
From | Date | Subject | |
---|---|---|---|
Next Message | Rui Zhao | 2023-08-08 04:35:38 | Re: pg_upgrade fails with in-place tablespace |
Previous Message | Masahiko Sawada | 2023-08-08 03:45:05 | Re: Performance degradation on concurrent COPY into a single relation in PG16. |