如何解决Postgres:大 blob 上的快速分面
我有一个带有大 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 也是如此。
我在想可能有某种表达索引,我也许可以重写构面查询以使用该表达,但我还没有弄清楚。
最坏的情况是,我可以将所有值提取到第二个表中并建立索引,我不想这样做。
解决方法
您唯一的希望是仅索引扫描,但由于这不适用于表达式索引,所以您出局了。无法避免扫描整个表并提取 JSON 值。
您必须以规范化的形式提取 JSON 值。这提醒我们,在关系数据库中,涉及 JSON 的数据模型通常是一个糟糕的选择(尽管存在有效的用例)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。