Skip to main content
 首页 » 数据库

列顺序影响PostgreSQL表存储空间

2022年07月19日147Terrylee

当定义表结构时,通常不会关心表字段顺序,因为select后面列顺序并不影响结果。但列顺序会影响表实际存储大小,也就说即使数据完全一样,但列顺序不同存储空间不同。

因为CPU对齐的缘故(cpu按照块方式访问),从而影响数据结构的内部大小。可能你不会相信,下面我们测试。

字段顺序布局

test=# CREATE TABLE t_test ( 
     i1       int, 
     i2       int, 
     i3       int,  
     v1       varchar(100), 
     v2       varchar(100), 
     v3       varchar(100) 
); 
-- CREATE TABLE 

我们创建了有6列的表,其中三个为int放在一起,另外三个varchar放在一起,下面插入1千万示例数据:

test=# INSERT INTO t_test SELECT 10, 20, 30, 'abcd', 'abcd', 'abcd' 
FROM generate_series(1, 10000000); 
-- INSERT 0 10000000 

现在检查表数据大小:

test=# SELECT pg_size_pretty(pg_relation_size('t_test')); 
 pg_size_pretty 
---------------- 
 574 MB 
(1 row) 

字段无序布局

下面改变列布局,varchar和int顺序打乱:

test=# CREATE TABLE t_test ( 
     v1       varchar(100), 
     i1       int, 
     v2       varchar(100), 
     i2       int, 
     v3       varchar(100), 
     i3       int 
); 
-- CREATE TABLE 

然后插入同样的数据:

test=# INSERT INTO t_test SELECT 'abcd', 10, 'abcd', 20, 'abcd', 30 
       FROM generate_series(1, 10000000); 
INSERT 0 10000000 
  
… the table will be a lot larger: 
  
test=# SELECT pg_size_pretty(pg_relation_size('t_test')); 
 pg_size_pretty 
---------------- 
 651 MB 
(1 row) 

我们看到数据完全一样(为了对比两者的差异)。如果我们使用“abc” 代替 “abcd”占用空间大小一样,因为4个字符是最小数据占用空间。

总结

通过上面示例,我们得出重要结论。尽可能让相似数据类型在一起,尤其是让int类型放在表的开始位置,会在空间和性能上有所提升。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/120005804
阅读延展