PostgreSQL 教程: 拆分宽表

六月 12, 2024

摘要:在本教程中,您将学习如何在 PostgreSQL 中拆分宽表。

目录

拆分表

考虑下表行太宽而无法获得良好性能的实体表的所有属性。寻找一些主题或原则,将它们分为两组。然后将表拆分为两个表,一个主表和一个副表,在每个表中重复下主键。

较短的行允许您快速查询或更新每个表。例如,我们有一个定义如下的表:

CREATE TABLE orders (
  order_num     integer primary key,
  order_date    date,
  customer_num  integer,
  ship_instruct varchar(40),
  ship_date     date,
  ship_weight   decimal(8,2),
  ship_charge   money(6,2),
  paid_date     date);

按数据量划分

划分实体表的一个原则是数据量。将较大的属性(通常是字符串)移动到副表中。将数值和其他小属性保留在主表中。在上面的示例中,您可以从 orders 表中拆分 ship_instruct 列。您可以给副表取名为 orders_ship。它有两列,一个主键列是 orders.order_num 的副本,另一个是原来的 ship_instruct 列。

按使用频率划分

划分实体表的另一个原则是使用频率。如果很少查询某些属性,可将它们移动到副表中。例如,在上面的示例表中,可能只有一个程序查询 ship_instructship_weightship_charge 列。在这种情况下,您可以将它们移动到副表中。

按更新频率划分

更新比查询花费的时间更长,更新程序会在更新过程中锁定数据页和数据行,从而阻止查询程序访问表。如果可以将一个表分成两个副表,一个包含更新最多的实体,另一个包含查询最多的实体,则通常可以缩短总体响应时间。

PostgreSQL 的 MVCC 工作原理是保存一个更新或删除的行(也称为元组)的内部副本,直到事务被提交或回滚。保存的内部副本对用户不可见。但是,当 VACUUM 或 AUTOVACUUM 程序未定期清理这些不可见的副本时,可能会出现表膨胀。您可以将经常更新的列移动到一个单独的表中,以节省存储成本,并加快数据库系统的处理速度。

拆分表的性能成本

拆分表需要占用额外的磁盘空间,并增加复杂性。每行会出现两个主键的副本,每个表中各有一个副本。还存在两个主键索引。

您必须修改使用到 SELECT * 的现有程序、报表和窗体,因为返回的列变少了。要使用两个表中属性的程序、报表和窗体,必须执行连接才能将表组合在一起。

在这种情况下,当您插入或删除一行时,将更改两个表而不是一个表。如果不协调两个表的更改(例如,通过在单个事务中插入和删除它们),则会失去语义完整性。

了解更多

PostgreSQL 优化