首頁 > 資料庫 > 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 陣列比較的查詢,特別是像提供了一種(檢查特定時間範圍內的事件) ,可以執行以下步驟採取:

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板