我試圖只得到一個表大小,然后是每一行的大小。當我使用
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 specific table in postgresql..?)
我得到 560669 位元組。
560669 與 393216 位元組 - 哪個是真實的?
uj5u.com熱心網友回復:
來自https://www.postgresql.org/docs/14/functions-admin.html
pg_table_size - 計算指定表使用的磁盤空間,不包括索引(但包括其 TOAST 表,如果有的話,可用空間映射和可見性映射)。
因此 pg_table_size 為您提供了 postgres 用于該表的磁盤數量以及 postgres 保留的有關該表的一些元資料(可見性映射和可用空間映射)。洗掉一行不會減少這個數字(除非你做一個 VACUUM FULL),所以我們不希望表使用的磁盤與每個可見行中的資料總和相匹配。相反,表使用的磁盤會更大。
pg_column_size - 顯示用于存盤任何單個資料值的位元組數。如果直接應用于表列值,這將反映已完成的任何壓縮。
所以這將回傳磁盤上每一行的大小(包括存盤在磁盤上的行頭資訊)。
我不確定您是否認為行標題資訊是“真實的”,但它確實占用了硬碟驅動器上的空間,因此這是否正確取決于您的用例。
使用資料庫中的示例表,我有:
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
我們希望這些查詢中的每一個都回傳不同的數字,并且每個都用于不同的目的。
至于您發布的具體數字(pg_column_size大于pg_table_size),我無法解釋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391465.html
標籤:数据库 PostgreSQL的 尺寸
