postgreSQL - 根据访问频率拆分大表?



我有一个有50个字段的表:

  1. 10个几乎总是需要的字段。
  2. 40个很少需要的字段。

我粗略地说,(1)中的字段需要访问的频率是(2)中的字段的1000倍。

我应该把它们分成两个一对一的表,还是把它们都放在同一个表中?

您所描述的过程有时被称为"垂直分区"。在极端情况下(每个垂直分区一个列),这就是列数据库存储数据的方式。不幸的是(据我所知),Postgres目前还没有直接支持垂直分区。

将数据分成两个表的想法是好的。我要注意以下几点:

  • 您需要修改使用额外列的查询以使用第二个表。(您可以将join包装到一个视图中,当您需要额外的列时使用。)
  • 如果两个表都有一个集群主键连接它们,那么join应该非常快。
  • 如果您正在插入/更新/删除数据,那么您需要小心同步。我认为你可以用一个INSTEAD OF触发器来处理这个问题。
  • 如果一些记录没有额外的列,这可能是空间方面的一大胜利。
  • 如果所有的记录和列都将被加载到缓存中,那么这可能不是一个大的胜利。

在某些情况下,这可能是一个很大的性能优势。但是需要额外的手工工作来保持表同步。

这里确实没有足够的信息来估计(更不用说实际上量化)好处是什么,但是代价是非常清楚的——更复杂的代码,更复杂的模式,可能更大的总体空间使用,以及添加和删除行时的性能开销。

性能的提高可能来自于在执行全表扫描时扫描更少的数据,或者在需要时在内存中找到数据块的可能性增加,以及总体上更小的内存占用,但是如果没有关于通常执行的操作类型的具体信息,以及服务器是否处于内存压力下,则无法给出可靠的建议。

要非常小心,不要让系统变得更复杂,因为这是不确定的性能增益的副作用。

最新更新