Querying Structures in Arrays using Postgres jsonb
Jsonb arrays can store structured data in Postgres, facilitating queries with nested objects. However, accessing array values with sequential indexes can result in sequential scans.
Proper Indexing for Improved Query Performance
To optimize queries involving jsonb array comparisons, specifically queries like the one provided (checking for events within a certain time range), the following steps can be taken:
Basic Approach (Postgres 12 and Later)
SELECT l.* FROM locations l WHERE l.events @? '$[*] ? (@.event_slug == "test_1") ? (@.end_time.datetime() < "2014-10-13".datetime()'
Advanced Approach Utilizing Materialized Views
If complex queries still result in poor performance, consider creating a materialized view with normalized relevant attributes:
Create Event Data Type:
CREATE TYPE event_type AS ( , event_slug text , start_time timestamp , end_time timestamp );
Create Materialized View:
CREATE MATERIALIZED VIEW loc_event AS SELECT l.location_id, e.event_slug, e.end_time -- start_time not needed FROM locations l, jsonb_populate_recordset(null::event_type, l.events) e;
Index Materialized View:
CREATE INDEX loc_event_idx ON loc_event (event_slug, end_time, location_id);
Query Materialized View:
SELECT * FROM loc_event WHERE event_slug = 'test_1' AND end_time >= '2014-10-30 14:04:06 -0400'::timestamptz;
By utilizing the proper operator class and considering advanced approaches like materialized views, you can achieve optimal performance for queries involving comparisons on jsonb array data.
The above is the detailed content of How Can I Optimize Postgres Queries on jsonb Arrays for Improved Performance?. For more information, please follow other related articles on the PHP Chinese website!