Re: Unable to make use of "deep" JSONB index

Поиск
Список
Период
Сортировка
От Shaheed Haque
Тема Re: Unable to make use of "deep" JSONB index
Дата
Msg-id CAHAc2jfjbuHW5g=b81sHPE4RcU_Lw7bi92jW+-Do4bKePsfq3g@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Unable to make use of "deep" JSONB index  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: Unable to make use of "deep" JSONB index  (Shaheed Haque <shaheedhaque@gmail.com>)
Список pgsql-bugs
On Thu, 2 Jun 2022 at 15:31, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>
> Shaheed Haque <shaheedhaque@gmail.com> writes:
> > -- Create index designed to match the query.
> > --
> > create index idx1 on payrun using gin ((snapshot->'$.employee.* ?
> > (@.pay_graph <> 0 || @.last_run_of_employment == true ||
> > @.state.employment[last][2] == 0)'));
>
> But that doesn't match the query; it's not even the same topmost
> operator:
>
> > explain analyse SELECT id,snapshot #>'{employee,999,state,employment}' FROM
> > "payrun" WHERE (snapshot @? '$.employee."999" ? (@.pay_graph <> 0 ||
> > @.last_run_of_employment
> > == true || @.state.employment[last][2] == 0)');

I assume you are referring to the difference between "snapshot @?" and
"snapshot ->"? If so, apologies: too much cutting and pasting from too
many experiments. I did in fact also try the "using btree ((snapshot
@?" form but it gave the same results.

> In general you seem to have much too high an opinion of what PG's
> index machinery can cope with.  The general pattern is that it can
> use a query WHERE clause with an index if the clause is of the form
> "indexed-column indexable-operator constant".  There's a small number
> of special cases where it can transform things that don't initially
> look like that into the right form, but AFAIR we don't have any
> such special cases for any json-related operators.

LOL. I'm pretty much a noob here, so that's very possible.

> The one saving grace is that "indexed-column" can be an expression
> appearing in an index, so in some cases you can finesse things
> that way.  But you won't find any deep knowledge of jsonpath
> expressions in there.

I was basing my efforts on this statement in the docs
https://www.postgresql.org/docs/14/datatype-json.html#JSON-INDEXING:

    GIN index extracts statements of following form out of jsonpath:
accessors_chain = const. Accessors chain may consist of .key, [*], and
[index] accessors. jsonb_ops additionally supports .* and .**
accessors.

Did I mis-implement, misunderstand or read too much into this?

> Having said that, @? is reported as an indexable operator in v14:
>
> regression=# \dAo gin jsonb*
>              List of operators of operator families
>  AM  | Operator family |      Operator      | Strategy | Purpose
> -----+-----------------+--------------------+----------+---------
>  gin | jsonb_ops       | @>(jsonb,jsonb)    |        7 | search
>  gin | jsonb_ops       | @?(jsonb,jsonpath) |       15 | search
>  gin | jsonb_ops       | @@(jsonb,jsonpath) |       16 | search
>  gin | jsonb_ops       | ?(jsonb,text)      |        9 | search
>  gin | jsonb_ops       | ?|(jsonb,text[])   |       10 | search
>  gin | jsonb_ops       | ?&(jsonb,text[])   |       11 | search
>  gin | jsonb_path_ops  | @>(jsonb,jsonb)    |        7 | search
>  gin | jsonb_path_ops  | @?(jsonb,jsonpath) |       15 | search
>  gin | jsonb_path_ops  | @@(jsonb,jsonpath) |       16 | search
> (9 rows)
>
> so it seems like you ought to get some benefit for this query
> from just a plain GIN index on "snapshot".

Interesting. I'm pretty sure I started there a few days ago without
any luck but I'll give it another spin (having learnt quite a bit
since then).

>
>                         regards, tom lane



В списке pgsql-bugs по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Unable to make use of "deep" JSONB index
Следующее
От: operations i
Дата:
Сообщение: Re: How is this possible "publication does not exist"