ホームページ > データベース > mysql チュートリアル > パフォーマンスを向上させるために jsonb 配列に対する Postgres クエリを最適化するにはどうすればよいですか?

パフォーマンスを向上させるために jsonb 配列に対する Postgres クエリを最適化するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-06 14:06:41
オリジナル
332 人が閲覧しました

How Can I Optimize Postgres Queries on jsonb Arrays for Improved Performance?

Postgres jsonb を使用した配列内の構造のクエリ

Jsonb 配列は Postgres に構造化データを格納でき、ネストされたオブジェクトを使用したクエリを容易にします。ただし、シーケンシャル インデックスを使用して配列値にアクセスすると、シーケンシャル スキャンが発生する可能性があります。

クエリ パフォーマンスを向上させるための適切なインデックス付け

jsonb 配列比較を含むクエリ、特に次のようなクエリを最適化するには1 つが提供されている場合 (特定の時間範囲内のイベントを確認する)、次の手順を実行できます。取得:

  • jsonb_path_ops 演算子クラスを使用: これにより、大なりまたは小なり演算子を含む複雑な jsonb 比較の効率的なマッチングが保証されます。

基本的なアプローチ (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 サイトの他の関連記事を参照してください。

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