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

大型PostgreSQL表:最好添加一列或创建一个新表来存储元数据?,sql,json,postgresql,database-design,Sql,Json,Postgresql,Database Design,我有一个大约200万行的大表,每行代表一个图像。我想为每个图像以JSON格式存储EXIF元数据。这个JSON blob大约为每个图像6KB 这种EXIF元数据不会经常被查询/使用,我想知道将其存储在一个单独的表中,并包含两列imageid、exifjson是否会更有效,或者PostgreSQL是否会像处理现有表上的文本列一样处理这一问题。我不希望添加列会显著降低表上普通查询的速度,也不希望添加数以百万计的6KB文本值使PostgreSQL陷入困境。最好使用单独的表,但您可以使用现有表。除非使用现

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


这种EXIF元数据不会经常被查询/使用,我想知道将其存储在一个单独的表中,并包含两列imageid、exifjson是否会更有效,或者PostgreSQL是否会像处理现有表上的文本列一样处理这一问题。我不希望添加列会显著降低表上普通查询的速度,也不希望添加数以百万计的6KB文本值使PostgreSQL陷入困境。

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

最大数据库大小不受限制 最大表大小32 TB 最大行大小1.6 TB 最大字段大小为1 GB 每个表的最大行数不受限制 表250-1600中的最大列数取决于列类型 每个表的最大索引数不受限制 关于选择其他列数据期间的干扰:

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

我会把那个专栏改成ed

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


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

谢谢。听起来不错,但是您有任何引用来备份它吗?如果其余的行小于BLOB的6K,那么将exif BLOB放在一个单独的表中将使不使用exif的典型查询的工作集占用空间大大减小,这意味着您可以更好地利用缓冲区空间。而不是用你不需要的东西填满它
 ALTER TABLE ... ALTER <column> SET STORAGE <EXTERNAL|EXTENDED>;
 -- EXTERNAL - out-of-line storage, not compression[1]
 -- EXTENDED - both compression and out-of-line storage