create table big(id integer primary key generated always as identity, s char(1000)) with(fillfactor = 10);
insert into big(s) values('foo');
insert into big(s) values('foo');
select ctid, id from big;
返回:
ctid | id
-------+----
(0,1) | 1
(1,1) | 2
(2 rows)
我不知道如何用fillfactor进行计算,以便将上表结构化为一记录/行一页?
-- return 2064,2
SELECT sum(pg_column_size(t.*)) as filesize, count(*) as filerow FROM big as t;
--return 1004
select pg_column_size(s) from big; --1004
只有我从手册中获得的信息。
fillfactor (integer)
表格的填充因子是 10 到 100 之间的百分比。默认值为 100(完全填充)。当指定较小的填充因子时,INSERT 操作仅将表页打包到指定的百分比;每页上的剩余空间保留用于更新该页上的行。这使 UPDATE 有机会将行的更新副本放置在与原始页面相同的页面上,这比将其放置在不同的页面上更有效。对于条目从不更新的表,完全打包是最佳选择,但在大量更新的表中,较小的填充因子是合适的。不能为 TOAST 表设置此参数。
进一步参考:https ://drive.google.com/file/d/1Bobgebpb07ctCM-Jk9XBxmY8k9CZkorn/view?usp=sharing页面:190。
看起来您的行大于一个 8kB 块的 10%,因此它们最终位于不同的块中。
char(1000)
意思是,因为它是用空白填充的,并且尺寸太小而无法触发 TOAST 压缩。