Re: How to create index on json array in postgres

From: Rene Romero Benavides <rene(dot)romero(dot)b(at)gmail(dot)com>
To: Alexey Bashtanov <bashtanov(at)imap(dot)cc>
Cc: Surya S <surya(dot)s(at)citrusinformatics(dot)com>, pgsql-sql(at)lists(dot)postgresql(dot)org
Subject: Re: How to create index on json array in postgres
Date: 2019-01-04 20:52:27
Message-ID: CANaGW090E+y4JFM6qxQTv9H6LQ-r63pTmURhGop32H+L5ffiOw@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-sql

What made you guys use a json array schema in the first place? is there a
requirement for storing highly variable fields or introducing/removing new
fields "on the fly"? IMHO, it's better a normalized approach if fields
don't vary that much for each record and you need to perform ad-hoc queries
in a performant manner, it would also make partitioning easier to implement
if needed.
How many records do you expect to have in this table? how do you expect it
to grow? what's the maximum array elements that each record could possibly
have? how are they going to be updated? frequently? rarely? are you
considering partitioning for this table?
If you really need the flexibility of the json data type, what about
creating independent fields for the common filters? you would be
duplicating information, but your indexes and queries would be less
complex.

On Fri, Jan 4, 2019 at 11:10 AM Alexey Bashtanov <bashtanov(at)imap(dot)cc> wrote:

>
> I have a json field called 'elements' in my table demo which contains
> an array 'data' containing key value pairs. the 'data' array has the below
> structure. the data array may have multiple json entries.I am using
> postgres version 9.5
>
> { "data": [{ "ownr": "1", "siUsr": [2], "sigStat": "APPR", "modifiedOn":
> 1494229698039, "isDel": "false", "parentId": "nil", "disName": "exmp.json",
> "uniqueId": "d88cb52", "usrType": "owner", "usrId": "1", "createdOn":
> 1494229698039, "obType": "file" }] }
>
> In my query I have multiple filters based on obj(Eg : obj->>usrId,
> obj->>siUsr etc) where obj corresponds to
> json_array_elements(demo.elements->'data').How do I create btree indices on
> filters like obj->>userId ,obj->>sigUsr? Please revert.
>
>
> I would maybe
> 1) make an immutable function called that extracts all user ids from json
> as an array:
> `create function extractUserIds(p_elements json) returns array as $$
> select array(select ... from json_array_elements(p_elements->...)); $$ ...;`
> 2) create a functional gin or gist index : `create index ... on ... using
> ... (extractUserIds(elements));`
> 3) use conditions like `where extractUserIds(elements) && array[...]`
>
> Alternatively, I'd consider a schema redesign, as it looks like you may
> benefit from a normalized schema.
>
> Best,
> Alex
>

--
El genio es 1% inspiración y 99% transpiración.
Thomas Alva Edison
http://pglearn.blogspot.mx/

In response to

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Steve Midgley 2019-01-04 21:04:28 Re: How to create index on json array in postgres
Previous Message Alexey Bashtanov 2019-01-04 17:10:37 Re: How to create index on json array in postgres