[英]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.