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

Slow distinct PostgreSQL query on nested jsonb field won't use index

我正在尝试从 JSONB 列的嵌套字段中获取不同的值,但在 400K 行上需要大约 2 分钟 table。 最初的查询使用 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 个唯一值。

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

没有索引会使速度更快,因为查询必须扫描整个 table。

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

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

但是,半百万行的两分钟时间并不是很快。你有慢速存储吗? table 肿了吗?如果是后者,VACUUM (FULL) 应该会有所改善。

您可以通过减少 I/O 来加快查询速度。使用 pg_prewarm 将 table 加载到 RAM 中,然后处理速度应该会快得多。