我有一张表格:
CREATE TABLE A (
id SERIAL,
name VARCHAR(32),
type VARCHAR(32) NOT NULL,
priority SMALLINT NOT NULL,
x SMALLINT NOT NULL,
y SMALLINT NOT NULL,
start timestamp with time zone,
end timestamp with time zone,
state Astate NOT NULL,
other_table_id1 bigint REFERENCES W,
other_table_id2 bigint NOT NULL REFERENCES S,
PRIMARY KEY(id)
);
在其他表ID1、状态和其他表ID2上添加附加索引。
该表非常大,对其他表ID1、状态列进行了很多更新。开始和结束列进行了少量更新,但其余列是不可变的。(状态为列状态的枚举类型。)
我想知道是否有必要将最频繁更新的两列拆分到一个单独的表中。我希望获得的是性能提升,当我只查找该信息时,或者减少更新的负担,因为(也许?)读写较短的行成本更低。但我需要权衡一下,在需要一次性获取特定项目的所有数据时,连接的成本是否会增加。
曾经我认为每个列都是单独存储的。但后来我修改了我的想法,因为我在某个地方读到,缩小表格一侧的列宽确实会对使用另一列查找数据的性能产生积极影响(因为行是一起存储的,所以整个行长度会更短)。所以我现在的看法是,一行的所有数据在物理上都存储在磁盘上;因此,拆分表格的建议听起来会有所帮助。当我当前写入4个字节来更新状态时,我应该相信我正在重新编写实际上从未更改的64个字节的文本(名称、类型)吗?
我对表格“规范化”并不是很有经验,也不熟悉Postgres的内部情况,因此我正在寻找建议和特别是估算权衡的最佳实践,而不必首先进行工作,然后确定该工作是否有价值。这个更改需要大量的工作来重写已经高度优化过的查询,因此我宁愿在了解我可以期望的结果之前进入。谢谢,M。