我不明白INT的存储大小(所有这些类型都有固定大小)之间的差异
在官方手册中,我看到了这个描述:
smallint,integer和bigint类型存储整数,即 不含分数成分的数字,各种范围。尝试去 存储值超出允许范围将导致错误。
类型整数是常见的选择,因为它提供了最佳平衡 范围,存储大小和性能之间。 smallint类型是 通常仅在磁盘空间非常宝贵的情况下使用。 bigint类型是 设计用于整数类型的范围 。不足
SQL仅指定整数类型integer(或int),smallint和 BIGINT。类型名称int2,int4和int8是扩展名,它们是 也被其他一些SQL数据库系统使用。
然而,简单的测试显示列的更改类型不会更改表大小
create table test_big_table_int (
f_int integer
);
INSERT INTO test_big_table_int (f_int )
SELECT ceil(random() * 1000)
FROM generate_series(1,1000000);
SELECT
pg_size_pretty(pg_total_relation_size(relid)) As "Size_of_table"
FROM pg_catalog.pg_statio_user_tables
where relname = 'test_big_table_int';
--"35 MB";
alter table test_big_table_int ALTER COLUMN f_int TYPE bigint;
SELECT
pg_size_pretty(pg_total_relation_size(relid)) As "Size_of_table"
FROM pg_catalog.pg_statio_user_tables
where relname = 'test_big_table_int';
--"35 MB";
alter table test_big_table_int ALTER COLUMN f_int TYPE smallint;
SELECT
pg_size_pretty(pg_total_relation_size(relid)) As "Size_of_table"
FROM pg_catalog.pg_statio_user_tables
where relname = 'test_big_table_int';
--"35 MB";"0 bytes"
每次我得到桌子的大小 - 35MB。那么使用整数或smallint insthead int8的利润在哪里?
第二个问题 - 为什么postgee在更改类型int(int2< - > int4< - > int8)时正在重写元组?