不是一个完整的数据库菜鸟,但我已经对此进行了大量研究,但我仍然无法弄清楚。我有一个与 CMS 绑定的 PostgreSQL 数据库。它目前在其中一个表中有 470 列(长话短说),我正在尝试弄清楚我们距离最大化的程度还有多远。
如果我跑
SELECT SUM(pg_column_size(table_name.*))/COUNT(*) FROM tablename;
我回来了
如果我跑
SELECT l.metric, l.nr AS bytes
, CASE WHEN is_size THEN pg_size_pretty(nr) END AS bytes_pretty
, CASE WHEN is_size THEN nr / NULLIF(x.ct, 0) END AS bytes_per_row
FROM (
SELECT min(tableoid) AS tbl -- = 'public.tbl'::regclass::oid
, count(*) AS ct
, sum(length(t::text)) AS txt_len -- length in characters
FROM table_name t -- provide table name *once*
) x
CROSS JOIN LATERAL (
VALUES
(true , 'core_relation_size' , pg_relation_size(tbl))
, (true , 'visibility_map' , pg_relation_size(tbl, 'vm'))
, (true , 'free_space_map' , pg_relation_size(tbl, 'fsm'))
, (true , 'table_size_incl_toast' , pg_table_size(tbl))
, (true , 'indexes_size' , pg_indexes_size(tbl))
, (true , 'total_size_incl_toast_and_indexes', pg_total_relation_size(tbl))
, (true , 'live_rows_in_text_representation' , txt_len)
, (false, '------------------------------' , NULL)
, (false, 'row_count' , ct)
, (false, 'live_tuples' , pg_stat_get_live_tuples(tbl))
, (false, 'dead_tuples' , pg_stat_get_dead_tuples(tbl))
) l(is_size, metric, nr);
任何人都可以帮助理解这一点,或者给我一些其他的东西来检查吗?
这取决于列的数据类型和存储的实际值。如果每一列都是可烘烤类型,在我手中,如果超过 448 列不是 null 且很大,则 470 列的表将开始抛出错误。这相对容易用 psql 的 \gexec 特性来演示。
产生: