首頁 >資料庫 >mysql教程 >如何優化 jsonb 數組上的 Postgres 查詢以提高效能?

如何優化 jsonb 數組上的 Postgres 查詢以提高效能?

Patricia Arquette
Patricia Arquette原創
2025-01-06 14:06:41342瀏覽

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

使用Postgres jsonb 查詢數組中的結構

Jsonb 數組可以在Postgres 中儲存結構化數據,方便使用嵌套物件進行查詢。但是,使用順序索引存取數組值可能會導致順序掃描。

適當的索引以提高查詢效能

要最佳化涉及jsonb 陣列比較的查詢,特別是像提供了一種(檢查特定時間範圍內的事件) ,可以執行以下步驟採取:

  • 使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn