PostgreSQL中int2,int4,int8的物理大小

时间:2016-02-08 13:28:11

标签: postgresql storage postgresql-9.3 database-administration alter

我不明白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)时正在重写元组?

0 个答案:

没有答案