SQL - 根据他们访问的频率拆分一个大表?

时间:2015-07-27 17:05:47

标签: sql postgresql

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

  1. 几乎总是需要10个字段。
  2. 40很少需要的字段。
  3. 我粗略地说,(1)中的字段需要比(2)中的字段更频繁地访问1000次。

    我应该将它们拆分为两个具有一对一关系的表,还是将它们全部放在同一个表中?

2 个答案:

答案 0 :(得分:1)

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

您将数据拆分为两个表的想法很好。我会注意到以下几点:

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

在某些情况下,这可能是一场巨大的表现胜利。但还有其他手动工作可以使表保持同步。

答案 1 :(得分:0)

这里确实没有足够的信息来估计(更不用说实际上量化)可能带来的好处,但成本非常明确 - 更复杂的代码,更复杂的架构,可能更大整体空间使用情况,以及添加和删除行时的性能开销。

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

要非常谨慎地使你的系统变得更加复杂,这是不确定性能提升的副作用。