嵌套jsonb字段上的慢速不同PostgreSQL查询将不使用索引

时间:2018-08-11 17:17:42

标签: postgresql postgresql-9.6

我正在尝试从JSONB列的嵌套字段中获得不同的值,但是在400K行表上大约需要2分钟。 原始查询使用的是DISTINCT,但后来我读到GROUP BY的效果更好,因此也尝试了此操作,但是没有运气-仍然非常慢。

添加索引也无济于事:

create index "orders_financial_status_index" on orders ((data ->'data'->> 'financial_status'));

ANALYZE EXPLAIN给出了以下结果:

HashAggregate  (cost=13431.16..13431.22 rows=4 width=32) (actual time=123074.941..123074.943 rows=4 loops=1)
  Group Key: ((data -> 'data'::text) ->> 'financial_status'::text)
  ->  Seq Scan on orders  (cost=0.00..12354.14 rows=430809 width=32) (actual time=2.993..122780.325 rows=434080 loops=1)
Planning time: 0.119 ms
Execution time: 123074.979 ms

值得一提的是,此列上没有空值,目前有4个唯一值。

我应该怎么做才能更快地查询不同的值?

1 个答案:

答案 0 :(得分:0)

没有索引会使此操作更快,因为查询必须扫描整个表。

如您所见,顺序扫描几乎一直使用;哈希聚合速度很快。

我仍然不会删除索引,因为它允许PostgreSQL准确地估计组数并决定更有效的哈希聚合,而不是对行进行排序。您可以尝试确保没有索引。

但是,半百万行的两分钟并不是非常快。您的存储空间慢吗?桌子table肿了吗?如果是后者,VACUUM (FULL)应该会有所改善。

您可以通过减少I / O来加快查询速度。使用pg_prewarm将表加载到RAM中,然后处理速度会大大提高。