我的 Postgres 17 数据库有一个大表,其中有 245 列,其中包含一个索引列ribakood
:
CREATE TABLE firma2.toode
(
...
ribakood character(20) COLLATE pg_catalog."default",
...
);
CREATE INDEX toode_ribakood_idx
ON firma2.toode
(ribakood COLLATE pg_catalog."default" ASC NULLS LAST);
查询如下trim()
:
explain analyze select toode,ostuhind, nimetus, pangateen
from firma2.toode where ribakood=TRIM('TESTTOODE/H ')
不使用索引:
Gather (cost=1000.00..575155.04 rows=4927 width=114) (actual time=101.341..2257.639 rows=1 loops=1)
Workers Planned: 3
Workers Launched: 0
-> Parallel Seq Scan on toode (cost=0.00..573662.34 rows=1589 width=114) (actual time=101.186..2257.436 rows=1 loops=1)
Filter: ((ribakood)::text = 'TESTTOODE/H'::text)
Rows Removed by Filter: 986481
Planning Time: 0.098 ms
Execution Time: 2257.653 ms
相同的查询,但不包含trim()
:
explain analyze select toode,ostuhind, nimetus, pangateen
from firma2.toode where ribakood='TESTTOODE/H'
使用索引:
Index Scan using toode_ribakood_idx on toode (cost=0.42..12.45 rows=2 width=114) (actual time=0.475..0.477 rows=1 loops=1)
Index Cond: (ribakood = 'TESTTOODE/H'::bpchar)
Planning Time: 0.147 ms
Execution Time: 0.490 ms
Postgres 将ribakood
列强制转换为类型text
,但找不到索引。如何强制第一个查询使用trim()
索引?
使用:x86_64-windows 上的 PostgreSQL 17.0,由 msvc-19.41.34120 编译,64 位