Postgres jsonb を使用した配列内の構造のクエリ
Jsonb 配列は Postgres に構造化データを格納でき、ネストされたオブジェクトを使用したクエリを容易にします。ただし、シーケンシャル インデックスを使用して配列値にアクセスすると、シーケンシャル スキャンが発生する可能性があります。
クエリ パフォーマンスを向上させるための適切なインデックス付け
jsonb 配列比較を含むクエリ、特に次のようなクエリを最適化するには1 つが提供されている場合 (特定の時間範囲内のイベントを確認する)、次の手順を実行できます。取得:
基本的なアプローチ (Postgres 12 および後ほど)
SELECT l.* FROM locations l WHERE l.events @? '$[*] ? (@.event_slug == "test_1") ? (@.end_time.datetime() < "2014-10-13".datetime()'
マテリアライズド ビューを利用した高度なアプローチ
複雑なクエリによって依然としてパフォーマンスが低下する場合は、正規化された関連属性を使用してマテリアライズド ビューを作成することを検討してください。
作成イベント データ タイプ:
CREATE TYPE event_type AS ( , event_slug text , start_time timestamp , end_time timestamp );
マテリアライズド ビューの作成:
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;
適切な演算子を利用するクラスを使用し、マテリアライズド ビューなどの高度なアプローチを考慮すると、jsonb 配列の比較を含むクエリで最適なパフォーマンスを達成できます。データ。
以上がパフォーマンスを向上させるために jsonb 配列に対する Postgres クエリを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。