嵌套 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 中,然后处理速度应该会快得多。
我正在尝试从 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 中,然后处理速度应该会快得多。