ホームページ >データベース >mysql チュートリアル >GIN インデックスを使用して Postgres JSONB 配列クエリを最適化する方法

GIN インデックスを使用して Postgres JSONB 配列クエリを最適化する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-06 13:25:40671ブラウズ

How to Optimize Postgres JSONB Array Queries with GIN Indexes?

Postgres で JSONB 配列で GIN インデックスを使用する方法

問題:
で JSONB 配列をクエリするときPostgres、events_gin_idx ON some_table USING を使用する GIN インデックスGIN (イベント);特定の配列要素を検索するクエリが最適化されない可能性があります。

原因:
クエリは jsonb_array_elements(events) AS e を使用して配列要素を JSON 配列要素に変換しているため、インデックス作成。

Postgres 12 または以降:
パス式を使用したクエリをサポートする GIN インデックスを作成するには、jsonb_path_ops 演算子クラスを使用します:

CREATE INDEX locations_events_gin_idx ON locations USING gin (events jsonb_path_ops);

Postgres 12 以降のクエリ構文:
@を使用しますか?条件に一致する配列要素をテストする演算子:

SELECT *
FROM locations
WHERE events @? '$[*] ? (@.event_slug == "test_1")
                      ? (@.end_time.datetime() < "2014-10-13".datetime()'

古いバージョンの Postgres のクエリ構文:
Postgres 12 より前のバージョンの場合、@> を使用できます。 ;部分的な JSON オブジェクトを使用した演算子:

SELECT *
FROM locations
WHERE events @> '[{ "event_slug": "test_1"}]';

マテリアライズド ビューを使用した高度なソリューション:
基本的なインデックス作成ソリューションのパフォーマンスが十分でない場合は、マテリアライズド ビューの作成を検討してください:

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;

CREATE INDEX loc_event_idx ON loc_event (event_slug, end_time, location_id);

マテリアライズド ビュークエリ:

SELECT *
FROM loc_event
WHERE event_slug = 'test_1'
AND end_time >= '2014-10-30 14:04:06 -0400'::timestamptz;

以上がGIN インデックスを使用して Postgres JSONB 配列クエリを最適化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。