postgresql – 位掩码的整数和位(n)数据类型之间是否有区别?

前端之家收集整理的这篇文章主要介绍了postgresql – 位掩码的整数和位(n)数据类型之间是否有区别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Postgresql数据库中的一个表,其中有一些布尔列可以确定某些状态(例如,已发布,可见等).我想制作一个单一的状态列,它将以一个位掩码的形式存储所有这些值以及可能的新值.在这种情况下,整数和位(n)之间是否有区别?

这将是一个相当大的表,因为它存储用户通过Web界面创建的对象.所以我想我将不得不使用(部分)这个列的索引.

如果你只有几个变量,我会考虑保留单独的 boolean列.

>索引很容易特别是indexes on expressionspartial indexes.
>查询条件易于编写和阅读,有意义.
>一个布尔列占用1个字节(无对齐填充).只有几个变量占用最少的空间.
>与其他选项不同,如果您需要,布尔列允许单个位的NULL值.如果没有,您可以随时定义列NOT NULL.

如果您手中的全部变量不超过32个,则integer列可能最有效. (或多达64个变量的bigint)

>在磁盘上占用4个字节(可能需要对齐填充,取决于前面的列).
>精确匹配的非常快的索引(=运算符).
>处理单个值可能比使用varbit或boolean更慢/更便利.

有更多的变量,或者如果你想操作的值很多,或者如果没有巨大的表或磁盘空间/ RAM不是一个问题,或者如果你不确定选择什么,我会考虑bit(n) or bit varying(n) (short: varbit(n).

>占用至少5个字节(或8个用于非常长的字符串)加1个字节,每组8位(向上舍入).
>您可以直接使用bit string functions and operatorssome standard SQL functions as well.

对于只有3位信息,单个布尔列获得3个字节,一个整数需要4个字节(可能是额外的对齐填充)和一个位字符串6个字节(5 1).

对于32位信息,一个整数仍然需要4个字节(填充),一个位串占用9个字节(5 4),而布尔列占用32个字节.

要进一步优化磁盘空间,您需要了解Postgresql的存储机制,特别是数据对齐. More in this related answer.

This answer如何转换布尔型,位(n)和整数也可能有帮助.

猜你在找的Postgre SQL相关文章