繁体   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