加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在PostgreSQL中将varchar更改为布尔值

发布时间:2020-12-13 16:33:21 所属栏目:百科 来源:网络整理
导读:我已经开始在一个有相当大的桌子(约82,000,000行)的项目上工作,我觉得很blo肿.其中一个字段定义为: consistency character varying NOT NULL DEFAULT 'Y'::character varying 它用作布尔值,值应始终为(‘Y’|’N’). 注意:没有检查约束等 我想提出理由来改
我已经开始在一个有相当大的桌子(约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约束只剩下.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读