postgresql – 当所有值都是36个字符时,char和varchar的索引查找
我有一个遗留架构(免责声明!),它为所有表的主键使用基于散列的生成id(有很多).这种id的一个例子是:
922475bb-ad93-43ee-9487-d2671b886479 改变这种方法是没有希望的,但是索引访问的性能很差.撇开这可能有多种原因,有一件事我注意到它似乎不是最优的 – 尽管所有多个表中的所有id值都是36个字符长,但列类型是varchar(36),而不是char(36) ). 将列类型更改为固定长度char(36)是否会提供任何显着的索引性能优势,除了每个索引页面的条目数量的极小增加等? 即使处理固定长度类型而不是可变长度类型,postgres的执行速度要快得多吗? 请不要提到微小的存储节省 – 与更改柱子所需的手术相比,这并不重要.
没有.根本没有收益.
The manual explicitly states:
大胆强调我的. char(n)是一种基本上过时的,无用的类型.坚持varchar(n).如果您不需要强制执行长度,则varchar或text会更快一点. 此外,如果所有字符串的长度恰好为36个字符,则无论如何都不会保存存储空间,即使是非常小的存储空间也是如此.两者在磁盘和RAM中的大小完全相同.您可以使用 有关: > Any downsides of using data type “text” for storing strings? 你没有要求其他选择,但我会提到两个: > > How do I efficiently get “the most recent corresponding row”? 广泛的基准比较(以及其他)COLLATE“C”对性能的影响: > Slow query ordering by a column in a joined table > UUID,显然.您的字符串可疑地看起来像UUID(32位十六进制数字加上4个分隔符).将这些作为实际的uuid数据类型存储会更加有效,它在多种方式下更快并且仅占用16个字节 – 而在RAM(37)或varchar(36)中存储37个字节(存储没有分隔符,只是32个定义的char),或磁盘上的33个字节.但在许多情况下,alignment padding将导致40字节.)COLLATION也与uuid数据类型无关. SELECT '922475bb-ad93-43ee-9487-d2671b886479'::uuid 这可能会有所帮助(最后几章): > Convert hex in text representation to decimal number 也可以看看: > What is the overhead for varchar(n)? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |