在PostgreSQL中将varchar更改为布尔值

前端之家收集整理的这篇文章主要介绍了在PostgreSQL中将varchar更改为布尔值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经开始在一个有相当大的桌子(约82,000,000行)的项目上工作,我觉得很blo肿.其中一个字段定义为:
consistency character varying NOT NULL DEFAULT 'Y'::character varying

它用作布尔值,值应始终为(‘Y’|’N’).

注意:没有检查约束等

我想提出理由来改变这个领域.这是我有的:

>它被用作一个布尔值,所以做到这一点.显性优于隐性.
>它将防止编码错误,因为现在有什么可以转换为文本将盲目地在那里.

这是我的问题.

>大小/存储怎么样?数据库是UTF-8.所以,我觉得在这方面真的没有太多的积蓄.对于布尔值应该是1个字节,而在UTF-8中应该是1字节的’Y'(至少这是我在Python中检查长度的时候).这里有没有其他存储开销将被保存?
>查询性能? Postgres会因为“= TRUE”与“=”Y“”的原因获得任何性能提升?

Postgresql(不像Oracle)有一个完全成熟的 boolean type.通常,“yes / no”应该是布尔值.这是正确的使用类型!

大小/存储?

基本上,boolean列在磁盘上占用1个字节,
文字或字符变化(quoting the manual here)…

the storage requirement for a short string (up to 126 bytes) is 1 byte
plus the actual string

这是简单字符的2个字节.因此,您可以将该列的存储空间减半.

实际存储比这更复杂.每个表有一些固定的开销,page and row,有特殊的NULL storage,有些类型需要data alignment.总体影响将是非常有限的 – 如果明显的话.
More on how to measure actual space requirement.

编码UTF8在这里没有任何区别.基本ASCII字符与其他编码如LATIN-1是位兼容的.

在你的情况下,根据你的描述,你应该保持NOT NULL constraint你似乎已经有了 – 独立于基础类型.

查询性能

在任何情况下,布尔值稍微好一些.除了稍微小一点之外,布尔的逻辑更简单,并且varchar或文本也通常负载COLLATION的具体规则.但是不要为那些简单的事情预料不到.

代替

WHERE consistency = 'Y'

你可以写:

WHERE consistency = TRUE

但是,真的,你可以简化为:

WHERE consistency

不需要进一步的评估.

更改类型

改变你的桌子很简单:

ALTER TABLE tbl ALTER consistency TYPE boolean
USING CASE consistency WHEN 'Y' THEN TRUE ELSE FALSE END;

此CASE表达式将所有不为TRUE(“Y”)的内容都折成FALSE. NOT NULL约束只剩下.

猜你在找的Postgre SQL相关文章