我应该使用 PostgreSQL 位串吗?

Jac*_*ung 20 postgresql

我最近一直在学习bit string数据类型,我很好奇:

  1. 这个文档页面的底部有一句话:

    ...加上 5 或 8 个字节的开销,具体取决于字符串的长度

  2. 在其他语言(如 PHP、Java、C#、C++ 等)中,如何通过 Npgsql、ODBC 等驱动程序处理位字符串?

对于问题 #1,使用 smallint 或 bigint 将提高存储效率,并且可能会提供性能提升,因为在任何地方都支持整数。大多数编程语言都可以轻松处理整数的位操作。如果是这样,那么引入位串数据类型的意义何在?是否仅适用于需要大量位掩码的情况?位域索引可能吗?我对 PostgreSQL 中如何进行位域索引比较好奇。

对于#2,我很困惑,不仅仅是好奇。例如,如果我将工作日位掩码存储在 bit(7) 字段中,一天一位,最低位代表星期一。然后我在 PHP 和 C++ 中查询该值。我会得到什么?文档说我会有一个位串,但是位串不是我可以直接使用的 - 就像整数一样。那么在这种情况下,我应该放弃位域吗?

任何人都可以详细说明为什么以及何时应该使用一点或一点变化?

Erw*_*ter 22

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

  • 索引很容易。特别是,表达式的索引很容易。
  • 查询和部分索引的条件易于编写和阅读且有意义。
  • 一个布尔列占用 1 个字节。仅对于少数变量,这占用的空间最少。
  • 与其他选项不同,NULL如果需要,布尔列允许单个位的值。NOT NULL如果不这样做,您始终可以定义列。

优化存储

如果您拥有多于一手的完整变量但少于 33 个,那么一integer可能最适合您。(或bigint最多 64 个变量。)

  • 在磁盘上占用 4 个字节。
  • 精确匹配(=运算符)的快速索引。
  • 处理单个值可能比使用bit string或更慢/更不方便boolean

使用更多变量,或者如果您想大量操作这些值,或者如果您没有巨大的表和磁盘空间/RAM 没有问题,或者如果您不确定选择什么,我会考虑bit(n)bit varying(n)

  • 占用至少 5 个字节(或对于很长的字符串为 8 个)加上每组 8 位(向上取整)的 1 个字节。
  • 您可以直接使用位串函数和运算符

例子

对于仅3 位信息,单个booleaninteger需要3 个字节,需要 4 个字节和bit string6 个字节 (5 + 1)。

对于32 位信息,ainteger仍然需要 4 个字节,abit string占用 9 个字节(5 + 4)和boolean列占用 32 个字节。

进一步阅读


Chr*_*ers 4

所有 PostgreSQL 类型对于某些事情都有用,而对于另一些事情则不太有用。一般来说,先担心功能再担心性能会带来更多好处。PostgreSQL 拥有大量用于操作各种数据类型的函数,这些也不例外。

我希望在应用程序层上,除非您的数据库驱动程序通过某种类型转换来处理它,否则您将获得字符串表示形式并且必须处理它。因此,它可能有用也可能没用。

当您想要基于按位运算(例如按位或或按位与,或以其他方式操纵 SQL 查询中的数据)时,它可能很有用。除非您这样做,否则 PostgreSQL 的许多深奥功能的帮助不大。

另请注意,对于较长的二进制信息字符串,有一个大对象接口,允许您进行流式传输等,还有一个字节接口,它允许更紧凑的字符串表示。

TL; 博士:如果你需要它,你就会知道。否则,请将其归档在您头脑中的“保留以供将来使用”部分中。