【问题标题】:Postgres: Fast facets on big blobsPostgres:大块的快速切面
【发布时间】: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


    【解决方案1】:

    您唯一的希望是仅索引扫描,但由于这不适用于表达式索引,所以您出局了。无法避免扫描整个表并提取 JSON 值。

    您必须以标准化形式提取 JSON 值。这提醒我们,在关系数据库中,涉及 JSON 的数据模型通常是一个糟糕的选择(尽管有有效的用例)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 2014-04-06
      • 2021-03-09
      • 2011-04-29
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      相关资源
      最近更新 更多