分割宽表

对于那些行太宽而影响性能的实体,请考虑其所有属性。 寻找某个主题或原则,将它们分为两组。 然后将表拆分为两个表,主表和伴随表,在每个表中重复主键。

较短的行使得您能快速查询或更新每个表。

按大小拆分

可以拆分实体表的一个原则是大小。 将大的属性(通常 为字符串)移到伴随表。 将数字和其他小的属性保留在主表中。 在演示数据库中,可以将 ship_instruct 列从 orders 表中拆分出去。 可以称伴随表为 orders_ship。 它有两列,复制自 orders.order_num 列的主键,和 原来的 ship_instruct 列。

按使用频率拆分

拆分实体的另一个原则是使用频率。 如果有几个属性很少被查询,可将它们移到伴随表。 例如:在演示数据库中,可能只有一个程序查询 ship_instructship_weightship_charge 列。 在这种情况下,可以将它们移到伴随表。

按更新频率拆分

更新所需的时间要比查询长,而且在更新过程中,更新程序要锁定索引页和数据行,防止查询程序访问此表。 如果可以将一个表分割为两个伴随表,一个用于最常更新的实体,而另一个用于最常查询的实体,那么总体响应时间通常会缩短。

拆分表的性能成本

将表进行拆分会使用额外的磁盘空间,并增加了复杂性。每行的主键会有两份副本,每个表一份。 同时还有两份主键索引。您可以使用以前章节中描述的方法来估算增加的页数。

由于返回的列数较少,因而您必须修改使用 SELECT * 的现有程序、报表和表单。使用来自两个表的属性的程序、报告和表单必须执行连接,以将表组合在一起。

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