我的一些同事声称:Postgres 使用一个简单的索引,比转换为文本的索引少一点......
CREATE INDEX simple_index ON my_table(my_varchar);
CREATE INDEX text_index ON my_table(my_varchar::text);
我想知道为什么分析总是将其转换为文本?
explain analyze select * from my_table where my_varchar = 'WONDERFUL_VARCHAR';
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------
Index Scan using simple_index on my_table (cost=0.42..8.92 rows=7 width=1192) (actual time=0.106..0.112 rows=4 loops=1)
Index Cond: ((my_varchar)::text = 'WONDERFUL_VARCHAR'::text)
Planning Time: 0.287 ms
Execution Time: 0.298 ms
我用 postgres16 探测了它,如果我将常量变量转换为文本,postgres 可以使用简单的 varchar 索引。
两个指标有什么区别?是否存在某些情况下,文本转换索引将使用 postgres 而简单索引则不会?
text
和 character varying
之间的转换是无操作,因为数据类型相同(character varying
中的长度检查除外)。你可以通过查看pg_cast
看到这一点:
SELECT castfunc, castcontext, castmethod
FROM pg_cast
WHERE castsource = 'character varying'::regtype
AND casttarget = 'text'::regtype;
castfunc │ castcontext │ castmethod
══════════╪═════════════╪════════════
0 │ i │ b
铸造方法
b
意味着类型是二进制强制的,因此不需要转换
因此,这些数据类型之间的任何转换都只是一种装饰,以保持严格的类型系统满意;它不会产生任何开销。
使用两个索引定义中的哪一个并不重要。