在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中检查长度的时候).这里有没有其他存储开销将被保存?
PostgreSQL(不像Oracle)有一个完全成熟的
boolean type.通常,“yes / no”应该是布尔值.这是正确的使用类型!
大小/存储? 基本上,
这是简单字符的2个字节.因此,您可以将该列的存储空间减半. 实际存储比这更复杂.每个表有一些固定的开销,page and row,有特殊的 编码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约束只剩下. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |