大型PostgreSQL表:最好添加一列或创建一个新表来存储元数据



我有一个大表(约200万行),每行代表一个图像。我想为每个图像以JSON格式存储EXIF元数据。这个JSON blob每个图像大约有6KB。

这个EXIF元数据不会经常被查询/使用,我想知道将它存储在一个有两列(imageid,exifjson)的单独表中是否会更高效,或者PostgreSQL是否会将其作为现有表上的text列来处理。我不想添加列来显著降低表上的普通查询速度,也不想添加数百万6KB的文本值来阻碍PostgreSQL。

我会将该列设为TOAST-ed。

 ALTER TABLE ... ALTER <column> SET STORAGE <EXTERNAL|EXTENDED>;
 -- EXTERNAL - out-of-line storage, not compression[1]
 -- EXTENDED - both compression and out-of-line storage

PostgreSQL已经尝试将其用于大于2kB的数据。

[1] "所使用的压缩技术是LZ压缩技术家族中一个相当简单且非常快速的成员。"

最好使用单独的表,但您可以使用现有的表。除非您使用现有的"select*from"查询检索此字段,否则您几乎不会受到影响。你永远不会用这样的数据填充postgres,因为它几乎有无限的阈值:

  • 最大数据库大小不受限制
  • 最大表大小32 TB
  • 最大行大小1.6 TB
  • 最大字段大小1 GB
  • 每个表的最大行数不受限制
  • 每个表的最大列数250-1600,具体取决于列类型
  • 每个表的最大索引数不受限制

http://www.postgresql.org/about/

关于选择其他列数据时的干扰:

超长值也存储在后台表中,这样它们就不会干扰对较短列值的快速访问。

http://www.postgresql.org/docs/current/static/datatype-character.html

最新更新