我有一个有50个字段的表:
- 10个几乎总是需要的字段。
- 40个很少需要的字段。
我粗略地说,(1)中的字段需要访问的频率是(2)中的字段的1000倍。
我应该把它们分成两个一对一的表,还是把它们都放在同一个表中?
您所描述的过程有时被称为"垂直分区"。在极端情况下(每个垂直分区一个列),这就是列数据库存储数据的方式。不幸的是(据我所知),Postgres目前还没有直接支持垂直分区。
将数据分成两个表的想法是好的。我要注意以下几点:
- 您需要修改使用额外列的查询以使用第二个表。(您可以将
join
包装到一个视图中,当您需要额外的列时使用。) - 如果两个表都有一个集群主键连接它们,那么
join
应该非常快。 - 如果您正在插入/更新/删除数据,那么您需要小心同步。我认为你可以用一个
INSTEAD OF
触发器来处理这个问题。 - 如果一些记录没有额外的列,这可能是空间方面的一大胜利。 如果所有的记录和列都将被加载到缓存中,那么这可能不是一个大的胜利。
在某些情况下,这可能是一个很大的性能优势。但是需要额外的手工工作来保持表同步。
这里确实没有足够的信息来估计(更不用说实际上量化)好处是什么,但是代价是非常清楚的——更复杂的代码,更复杂的模式,可能更大的总体空间使用,以及添加和删除行时的性能开销。
性能的提高可能来自于在执行全表扫描时扫描更少的数据,或者在需要时在内存中找到数据块的可能性增加,以及总体上更小的内存占用,但是如果没有关于通常执行的操作类型的具体信息,以及服务器是否处于内存压力下,则无法给出可靠的建议。
要非常小心,不要让系统变得更复杂,因为这是不确定的性能增益的副作用。