Re: Poor plan choice with partial unique indexes on jsonb column and simple RLS policy (with test script)

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Alastair McKinley <a(dot)mckinley(at)analyticsengines(dot)com>
Cc: "pgsql-general(at)lists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: Poor plan choice with partial unique indexes on jsonb column and simple RLS policy (with test script)
Date: 2020-03-04 00:04:40
Message-ID: 11492.1583280280@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Alastair McKinley <a(dot)mckinley(at)analyticsengines(dot)com> writes:
> I have recently encountered a strange poor query plan choice after implementing RLS.
> My table has a number of partial indexes on a jsonb column and the query went from low number of milliseconds to several seconds as the planner chose a different index.
> Simply stated, in the jsonb column case, "using ( (select true) )" instead of "using (true)" produces a bad plan, illustrated below:

If the planner isn't sure you have access to all rows in the table,
that disables some of its ability to estimate where-clause selectivity.
In particular it can't run "leaky" where-clauses against all values in
the table's statistics entries to see how many pass, because a nefarious
user could use that to glean info about what's in the table. Eyeing your
test query, it looks like the issue is that jsonb "->" isn't leakproof,
so that clause falls back to a default selectivity estimate, and you
get a bad plan as a result.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Alastair McKinley 2020-03-04 00:37:41 Re: Poor plan choice with partial unique indexes on jsonb column and simple RLS policy (with test script)
Previous Message David G. Johnston 2020-03-03 23:19:08 Re: Detecting which columns a query will modify in a function called by a trigger