我应该使用PostgreSQL位串吗?


18

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

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

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

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

对于问题1,使用smallint或bigint会提高存储效率,并且可能会提高性能,因为到处都支持整数。大多数编程语言都可以轻松地对整数进行位运算。如果是这样,引入位串数据类型有什么意义?是否仅适用于需要大量位掩码的情况?位字段索引可能吗?我对PostgreSQL中如何完成位字段索引感到好奇。

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

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



2
Erwin在SO上的回答很好(如果您不介意通过@Erwin复制它,在此处会很有用),但是我想特别提醒您:在大多数情况下,您不会考虑存储信息在RDBMS上的位字符串中-在普通解决方案中使用单独的布尔列,而不考虑存储的“效率”。
杰克说请尝试topanswers.xyz 2012年

@JackDouglas:我不介意复制我的答案。不过,我想知道:在SE网站之间重复答案是个好主意吗?
Erwin Brandstetter 2012年

@Erwin我不明白为什么-站点之间有一些重叠,而且它们都应该独立存在(例如,我们不会-无论如何都不能-在这里关闭一个问题,是否存在重复项)关于SO的相同问题)。我们的重点更多地放在了“专家”问题上,但是,海事组织(IMO)您的回答恰好符合该类别:)
杰克说尝试topanswers.xyz 2012年

@JackDouglas:嗯,很有道理。无论如何,在您赞美之后,我怎么可能不同意?;)
Erwin Brandstetter

Answers:


18

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

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

优化存储

如果您有多个完整的手变量但小于33,则一integer可能会为您提供最佳服务。(或bigint最多64个变量。)

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

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

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

例子

对于仅3位的信息,各个boolean列使用3个字节,integer需要4个字节和bit string6个字节(5 +1)。

对于32位信息,integer仍然需要4个字节,bit string相同(5 + 4)则要占用9个字节,而boolean列则要占用32个字节。

进一步阅读


是的,我同意你的看法。目前,我正在使用samllint存储工作日的位掩码。它适合这种情况,存储效率/性能范围广。但是,如果我对位掩码进行更多的索引/过滤,由于性能低下,它将失败。
张学友2012年

3

所有PostgreSQL类型对某些事情都有用,而对其他事情则不那么有用。通常,您不必担心先要功能,而后才要担心性能。PostgreSQL有大量用于处理各种数据类型的函数,这些也不例外。

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

在您希望基于按位操作(例如按位或或按位)选择记录的地方,或者以其他方式操纵SQL查询中的数据时,可能有用的地方。除非您这样做,否则PostgreSQL的许多更深奥的功能都不太有用。

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

tl; 医生:如果您需要它,您会知道的。否则,请将其归档到您的“保留以备将来使用”部分。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.