簡體   English   中英

jsonb gin 索引未在 postgresql 中使用

[英]jsonb gin index not being used in postgresql

我在表中的 jsonb 列上創建以下索引:

CREATE INDEX idx_gin_accounts ON t1 USING GIN (accounts jsonb_path_ops);
CREATE INDEX idx_gin_stocks ON t1 USING GIN (stocks jsonb_path_ops);

CREATE INDEX idx_gin_stocks_value ON t1 USING GIN ((stocks-> 'value'));
CREATE INDEX idx_gin_stocks_type ON t1 USING GIN ((stocks-> 'type'));

我的查詢是這樣的:

SELECT  
    t.accounts ->> 'name'                             as account_name
    //other columns
FROM t1 t
         left join lateral jsonb_array_elements(t.accounts) a(accounts)
                   on 1 = 1 and a.accounts @> '{"role": "ADVISOR"}'
         left join lateral jsonb_array_elements(t1.stocks) s(stocks)
                   on 1 = 1 and s.stocks @> '{"type": "RIC"}'
WHERE (s.stocks -> 'value' ? 'XXX')

當我使用EXPLAIN ANALYSE進行分析時,我沒有看到查詢計划中使用了這些索引。

是否應該創建不同的索引? 或者我如何使用這些來加快搜索速度?

說當我在 where 條件下傳入(s.stocks-> 'value' ? 'XXX')時,我希望搜索是最佳的?

您不能索引集合返回函數的結果(除了創建物化視圖)。

我們可以a.accounts @> '{"role": "ADVISOR"}'出,如果a.accounts @> '{"role": "ADVISOR"}'t.accounts @> '[{"role": "ADVISOR"}]'是必要t.accounts @> '[{"role": "ADVISOR"}]' PostgreSQL 無法解釋這一點,但我們可以。

但是,這也無濟於事,因為您正在執行左連接。 如果 t1 的每一行都被返回,那么索引要完成什么?

通過添加 WHERE 子句,您可以使用 JSONPATH(如果您使用的是最新版本的 PostgreSQL)來獲取您想要的 t1 行。 它將使用t1 (stocks)上的索引,有或沒有jsonb_path_ops

WHERE (s.stocks -> 'value' ? 'XXX') AND
    t.stocks @? '$[*] ? (@.type == "RIC" ) ? (exists (@.value.XXX))';

但是,如果幾乎所有條目都具有 RIC 類型,則索引實際上並不是很有效,因此這是一種得不償失的勝利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM