尽管列
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
由于几乎所有行都满足条件,因此顺序扫描比使用索引更快。由于您没有显示更多问题,因此无法回答更多问题。
即使条件删除了大部分行(正如劳伦兹所说,事实并非如此),它仍然无法使用,因为“值”上的索引无法有效地使用来满足
length(value) ...
。所以索引只能用于 IS NOT NULL 部分。
当
length(value)
专门针对零进行测试时,可能会在特殊情况下对待相同的 "value" > ''
,但这还没有完成,而且我没有看到这种类型的技巧被实现。