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_size
比pg_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_size
比pg_table_size
大)我没法解释。