将几个布尔值存储为数组是否有意义?

Xod*_*rap 9 postgresql performance database-design datatypes array

我有一个包含五个布尔列的表。在 90% 以上的行中,所有列都为空。(False相当于null我。)

我可以有一个包含枚举自定义数据类型数组的单个数组列,而不是具有布尔列,从而仅存储非空的列。

我觉得使用数组很奇怪,但我的同事向我指出,并没有真正强烈的理由反对使用它们,而且我们实际上可能会看到使用它们的节省,因为我们没有存储一堆空列。

使用数组有什么缺点吗?具体来说:它们会占用更多空间,占用更多时间进行查询,还是阻止使用 Postgres 功能(例如 gin 索引)?

Erw*_*ter 9

TL; DR:做使用数组。使用单独的boolean列。


您的同事可能不知道实际的存储要求。空存储在 Postgres 中非常便宜且高效。

boolean列也非常便宜和高效——无论是否可以为空。实际上,只有 5boolean列对于行大小几乎没有影响 - 即使定义了NOT NULL. 每个 1 个字节,5 个字节,没有对齐限制。几乎不相关。通常,您可以对您的行做更多实质性的事情。(您应该已经提供了实际的表定义。)

数组的开销为24 字节。加上实际数据。而且处理起来不那么方便,而且更贵:

  • PostgreSQL中计算和节省空间

此相关答案对三个相关选项进行了详细评估:

  1. 分离 boolean
  2. 一个 integer编码多达 32 个布尔值
  3. 位串(bit(n)bit varying(n)