PostgreSQL 列大小与 table 大小

PostgreSQL column size vs table size

我试图只获取一个 table 大小,然后是每一行的大小。 当我使用

SELECT pg_table_size(*mytable*) as DATA;

我得到 393216 字节。

正在使用

SELECT (SUM(pg_column_size(t) - 24)) FROM *mytable* AS t;

(如此处所写 How to get each row size of a particular table in postgresql..?

我得到 560669 字节。

560669 与 393216 字节 - 哪个是真实的?

来自https://www.postgresql.org/docs/14/functions-admin.html

pg_table_size - Computes the disk space used by the specified table, excluding indexes (but including its TOAST table if any, free space map, and visibility map).

所以 pg_table_size 给出了 postgres 用于 table 的磁盘数量以及 postgres 保留的关于 table 的一些元数据(Visibility Map and Free Space Map). Deleting a row will not decrease this number(除非你执行 VACUUM FULL),因此我们不希望 table 使用的磁盘与每个可见行中的数据总和相匹配。相反,table 使用的磁盘会更大。

pg_column_size - Shows the number of bytes used to store any individual data value. If applied directly to a table column value, this reflects any compression that was done.

所以这 returns 是磁盘上每一行的大小(包括存储在磁盘上的 row-header 信息)。

我不确定你是否会考虑行 header 信息 'real',但它确实占用了你硬盘上的 space,所以这是否正确取决于您的用例。

使用数据库中的示例 table:

SELECT pg_table_size('users')
-- 3751936 <-- the size of my 'users' table on disk, including table meta-data
SELECT (SUM(pg_column_size(t.*))) FROM users AS t;
-- 3483028 <-- the total size on disk of the visible rows, including row "header" metadata.
SELECT (SUM(pg_column_size(t.*)-24)) FROM users AS t;
-- 3069412 <-- the size of the data in visible rows, excluding row "header" meta-data

我们希望这些查询中的每一个都 return 不同的数字,并且每个都有不同的用途。

至于你发的具体数字(pg_column_sizepg_table_size大)我没法解释。