Postgres 索引在 varchar 列上的使用

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

我的一些同事声称: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 而简单索引则不会?

postgresql indexing text
1个回答
0
投票

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

意味着类型是二进制强制的,因此不需要转换

因此,这些数据类型之间的任何转换都只是一种装饰,以保持严格的类型系统满意;它不会产生任何开销。

使用两个索引定义中的哪一个并不重要。

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