Performance 性能类型varchar(1)或smallint以存储状态Postgres

Performance 性能类型varchar(1)或smallint以存储状态Postgres,performance,postgresql,varchar,Performance,Postgresql,Varchar,我将存储一个从0到7的状态,考虑到Postgres数据库的性能和空间,我想知道哪个类型字段更适合存储:varchar(1)还是smallint 顺便问一下,设置一个varchar(1)或varchar(100)字段有什么区别,仍然在谈论性能和空间吗?在我看来,您打错了仗。您担心存储整数而不是单个字符字段会对性能造成影响,我认为这是一种短视的想法。整数与单个字符对性能的实际影响是微不足道的,我怀疑这是否可以有意义地衡量。根据我的经验,更重要的是减少系统开发人员和用户的认知负荷,因此最好使用足够长的

我将存储一个从0到7的状态,考虑到Postgres数据库的性能和空间,我想知道哪个类型字段更适合存储:varchar(1)还是smallint


顺便问一下,设置一个varchar(1)或varchar(100)字段有什么区别,仍然在谈论性能和空间吗?

在我看来,您打错了仗。您担心存储整数而不是单个字符字段会对性能造成影响,我认为这是一种短视的想法。整数与单个字符对性能的实际影响是微不足道的,我怀疑这是否可以有意义地衡量。根据我的经验,更重要的是减少系统开发人员和用户的认知负荷,因此最好使用足够长的字符字段,以包含对状态的合理描述,而不是数值或单个字符缩写。不必记住1、2、“A”或“X”的意思非常有用。我建议不要使用这些缩写值,而是使用易于理解的值,如“就绪”、“活动”、“已处理”、“已取消”等

至于问题的第二部分——不是真的。移动较长的字符串可能需要很短的时间,但除非您讨论的是数百万个值,否则这很短


祝你好运。

虽然我同意Bob Jarvis的观点,这确实是一种过早的优化,但我会尽力把重点放在所问的问题上

你忽略了最重要的选择。您的选择包括:

  • smallint
  • enum
  • “char”
  • 字符
    字符变化
您可以使用枚举类型。因为PostgreSQL目前不支持从枚举类型中删除值,所以只有当您希望永远不会删除有效值时,这才是真正可行的

或者,您可以使用
“char”
数据类型。是的,报价很重要。它是单个字符,就像C数据类型
char
。没有引号的
char
在解析时变成
character(1)

varchar
character
对于这两种类型来说并不理想,因为它们是可变宽度类型,具有标头开销等

顺便问一下,设置一个字段
varchar(1)
varchar(100)
,仍然谈论性能和空间,有什么区别吗


不。这在其他问题中得到了回答(很多次)。

我们谈论的是一个具有一列和一行的表,用于存储[0,7]范围内的整数值吗?如果您担心单个字符对存储空间的影响,那么您可能从20世纪60年代开始经历时间旅行。@NevilleK-我们在20世纪70年代也担心这种事情…:-)假设您有几十亿行和一个
CHAR(1)
字段。在这种情况下,该字段的空间成本为几GB。现在,那要花多少钱?谷歌表示,目前1 TB的磁盘驱动器价格约为45美元。考虑到这一点,3g的空间成本约为13.5美分。所以你的问题归结为,“这个状态字段值13.5美分吗?”这个字段的
smallint
版本将占用2个字节,因此成本是原来的两倍-27美分。祝你好运,我是说,假设你有1200亿行
smallint
需要2个字节才能写入磁盘<代码>整数需要4个字节。那么,差值就是2400亿字节。大约223千兆字节。假设单个SSD驱动器的写入性能良好,则需要7分钟以上的时间。在我看来,有很多时间和空间需要担心。当然,如果您谈论的是1000行,那么担心数据类型就不那么重要了。但我认为向自己提出这样的问题并担心数据类型的选择以及对用例的影响是一种很好的做法。您不需要存储十亿行“就绪”、“活动”等来防止用户翻译单字符代码。这就是关系的意义所在。规范化数据库可以带来很大的好处,尤其是对于大型数据集。