我正在尝试从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个唯一值。
我应该怎么做才能更快地查询不同的值?
答案 0 :(得分:0)
没有索引会使此操作更快,因为查询必须扫描整个表。
如您所见,顺序扫描几乎一直使用;哈希聚合速度很快。
我仍然不会删除索引,因为它允许PostgreSQL准确地估计组数并决定更有效的哈希聚合,而不是对行进行排序。您可以尝试确保没有索引。
但是,半百万行的两分钟并不是非常快。您的存储空间慢吗?桌子table肿了吗?如果是后者,VACUUM (FULL)
应该会有所改善。
您可以通过减少I / O来加快查询速度。使用pg_prewarm将表加载到RAM中,然后处理速度会大大提高。