【发布时间】:2021-05-18 20:50:42
【问题描述】:
我有一个带有大 jsonb 列的 Postgres 表。
CREATE TABLE mytable (id integer, my_jsonb jsonb)
my_jsonb 列包含如下数据:
{
name: 'Bob',
city: 'Somecity',
zip: '12345'
}
该表包含数百万行。
我需要在我们用户界面的各个字段上创建方面,即聚合。例如:
city | count
New York | 1000
Chicago | 3000
Los Angeles | 4000
maybe 200 more values...
我当前的查询产生了正确的结果,如下所示:
select my_jsonb->>'city', count(*)
from mytable
where foo='bar'
group by my_jsonb->>'city'
order by my_jsonb->>'city'
问题是它非常缓慢。这需要 5-10 秒,具体取决于我选择的特定列。它必须进行全表扫描并逐行提取每个 jsonb 值。
问题:我如何创建一个索引来有效地执行此查询,并且无论我选择哪个 jsonb 字段都可以工作?
GIN 索引不起作用。查询优化器不使用它。 jsonb 列上的简单 BTREE 也是如此。
我在想可能有某种表达式索引,我也许可以重写分面查询来使用表达式,但我还没有想通。
在最坏的情况下,我可以将所有值提取到第二个表中并为其编制索引。
【问题讨论】:
标签: postgresql query-optimization