postgres 并行顺序扫描

问题描述 投票:0回答:2

尽管列

cpv.value
上存在索引,但仍选择并行顺序扫描。
value
列的数据类型为“text”。这是查询计划中成本最高的步骤。我如何调整它以减少成本/时间?

->  Parallel Seq Scan on c_parameter_values cpv  (cost=0.00..143904.60 rows=692147 width=49) (actual time=0.007..988.860 rows=1187002 loops=3)
      Output: cpv.value, cpv.c_instance_id, cpv.parameter_id
      Filter: ((cpv.value IS NOT NULL) AND (length(cpv.value) > 0))
      Rows Removed by Filter: 470863
      Buffers: shared hit=112758
      Worker 0:  actual time=0.006..1002.245 rows=920578 loops=1
        Buffers: shared hit=29448
      Worker 1:  actual time=0.005..962.916 rows=922578 loops=1
        Buffers: shared hit=29286
postgresql query-optimization
2个回答
1
投票

由于几乎所有行都满足条件,因此顺序扫描比使用索引更快。由于您没有显示更多问题,因此无法回答更多问题。


0
投票

即使条件删除了大部分行(正如劳伦兹所说,事实并非如此),它仍然无法使用,因为“值”上的索引无法有效地使用来满足

length(value) ...
。所以索引只能用于 IS NOT NULL 部分。

length(value)
专门针对零进行测试时,可能会在特殊情况下对待相同的
"value" > ''
,但这还没有完成,而且我没有看到这种类型的技巧被实现。

© www.soinside.com 2019 - 2024. All rights reserved.