我的问题与 Postgres 的工作原理有关:
我有一张桌子:
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)
);
在 other_table_id1、state 和 other_table_id2 上有附加索引。
该表非常大,并且在列上看到了很多更新:other_table_id1,state。开始和结束列的一些更新,但其余的都是不可变的。(Astate 是列状态的枚举类型。)
我想知道将两个最常更新的列拆分到单独的表中是否有意义。我希望获得的是性能,因为当我只是查找该信息时,或者减少更新的重量,因为(也许?)读取和写入较短的行成本更低。但是,当(偶尔)需要一次获取特定项目的所有数据时,我需要权衡连接成本。
有一次,我的印象是每一列都是单独存储的。但后来,当我在某处读到减小表一侧列的宽度确实会对使用另一列查找数据时的性能产生积极影响时,我修改了我的想法(因为行存储在一起,所以总行长度会更短)。所以我现在的印象是一行的所有数据都物理存储在磁盘上。所以建议的表格拆分听起来会很有帮助。当我当前写入 4 个字节来更新状态时,我是否相信我正在重写实际上永远不会改变的 64 个字节的文本(名称、类型)?
我对表“规范化”不是很有经验,也不熟悉 Postgres 的内部结构,所以我正在寻找建议和特别是最佳实践来估计权衡,而不必先做这项工作,然后确定这项工作是否值得. 这种变化需要在重写已经高度优化的查询方面付出相当大的努力,所以我宁愿深入了解我可以期待什么结果。谢谢,M。