ホームページ > データベース > mysql チュートリアル > PostgreSQL で JSONB 配列のインデックス付けとクエリを効率的に行うにはどうすればよいですか?

PostgreSQL で JSONB 配列のインデックス付けとクエリを効率的に行うにはどうすればよいですか?

DDD
リリース: 2025-01-06 13:29:40
オリジナル
337 人が閲覧しました

How to Efficiently Index and Query JSONB Arrays in PostgreSQL?

Postgres JSONB の配列内の構造をクエリするための適切なインデックス

Postgres JSONB フィールドに格納されている構造化データの配列を効果的にインデックス付けしてクエリするには、次のようにします。次の手順を検討してください。

1.正しい配列アクセス:

JSONB コンテキストで配列要素にアクセスするには、正しい構文を使用します。例:

e->0->>'event_slug'
ログイン後にコピー

2. JSONB のカスタム演算子:

JSONB フィールドの大なりまたは小なり比較に jsonpath 演算子を利用します。 Postgres 12 以降では、@?:

e->0->>'end_time' @> '2014-10-13'
ログイン後にコピー

を使用します。または、古いバージョンでは、jsonb_path_ops:

CREATE INDEX events_gin_idx ON locations USING GIN (events jsonb_path_ops);
ログイン後にコピー

3 を使用します。 Postgres 12 の基本的な解決策:

等価性チェックには、@? を使用します。演算子:

SELECT l.*
FROM locations l
WHERE l.events @? '$[*] ? (@.event_slug == "test_1")';
ログイン後にコピー

OR タイプのフィルターの場合は、次の構文を使用します:

SELECT l.*
FROM locations l
WHERE l.events @? '$[*] ? (@.event_slug == "test_1") ? (@.start_time.datetime() < "2014-10-13".datetime() || @.end_time.datetime() < "2014-10-13".datetime())';
ログイン後にコピー

4.すべての Postgres バージョンの基本的な解決策:

等価性チェックには、@> を使用します。演算子:

SELECT * FROM locations WHERE events @> '[{&quot;event_slug&quot;:&quot;test_1&quot;}]';
ログイン後にコピー

以上のチェックの場合は、サブクエリ:

SELECT l.*
FROM locations l
JOIN jsonb_array_elements(l.events) e ON l.events @> '[{&quot;event_slug&quot;:&quot;test_1&quot;}]'
WHERE (e->>'end_time')::timestamp >= '2014-10-30 14:04:06'::timestamptz;
ログイン後にコピー

5 を使用します。マテリアライズド ビューを使用した高度なソリューション:

複雑なクエリで最適なパフォーマンスを得るには、関連データを正規化された形式で保存するマテリアライズド ビューの作成を検討してください:

CREATE MATERIALIZED VIEW loc_event AS
SELECT l.location_id, e.event_slug, e.end_time
FROM locations l, jsonb_populate_recordset(null::event_type, l.events) e;
ログイン後にコピー

6.マテリアライズド ビューのインデックス付けとクエリ:

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;
ログイン後にコピー

以上がPostgreSQL で JSONB 配列のインデックス付けとクエリを効率的に行うにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート