估计 Postgres 中的(记录的)大小和开销

art*_*hur 9 postgresql size postgresql-9.4 cardinality-estimates

考虑 Postgres 9.4 中的下表:

CREATE TABLE t
(
  a1 bigserial,
  a2 bigint NOT NULL,
  a3 bigint NOT NULL,
  a4 integer, 
  a5 timestamp with time zone NOT NULL,
  a6 timestamp with time zone NOT NULL DEFAULT now(),
  a7 bigint NOT NULL,
  a8 bigint NOT NULL,
  a9 real,
  a10 integer,

  CONSTRAINT kkkey PRIMARY KEY (a1)
)
Run Code Online (Sandbox Code Playgroud)

保存这张表的估计成本是多少?

创纪录的成本:

size(bigserial) 
+ size(bigint) 
+ size(bigint) 
+ size(integer) 
+ size(timestamp) 
+ size(timestamp) 
+ size(bigint) 
+ size(bigint) 
+ size(real) 
+ size(integer)
= 8 + 8 + 8 + 4 + 8 + 8 + 8 + 8 + 4 + 4 = 68 bytes
Run Code Online (Sandbox Code Playgroud)

Postgres 的数据库页面布局提供了相当详细的信息,这些记录是如何进入二级存储的,但我不确定如何将所有数字放在一起。

Linux 报告

blockdev --getbsz /dev/sda1
1024
Run Code Online (Sandbox Code Playgroud)

问题:

(1) 是否有任何辅助函数来评估每行的存储成本(因此不需要手动进行那些复杂的计算)

(2) 如何将这些数字放在一起,即估计每一行的间接成本?

(3) 如何估算主键索引的成本?

Ren*_*nzo 8

手册中记录了给出列、表和索引大小的函数:http : //www.postgresql.org/docs/9.4/static/functions-admin.html

没有计算整个记录大小的函数(而有一个函数可以知道单个数据值(pg_column_size)的存储成本),因为记录通常是可变长度的(有时它们被压缩),所以我认为您有两种可能性,要么执行目录查询以汇总表的所有列的大小,要么简单地获取填充表的大小并除以记录数,从而获得记录的平均大小。