在Postgres中,CREATE TABLE语句中的列顺序是否会影响性能?考虑以下两种情况:

CREATE TABLE foo (
  a      TEXT, 
  B      VARCHAR(512),
  pkey   INTEGER PRIMARY KEY,
  bar_fk INTEGER REFERENCES bar(pkey),
  C      bytea
); 

与.

CREATE TABLE foo2 (
  pkey   INTEGER PRIMARY KEY,
  bar_fk INTEGER REFERENCES bar(pkey),
  B      VARCHAR(512),      
  a      TEXT, 
  C      bytea
);

由于列的字节对齐更好,foo2的性能会比foo更好吗?当Postgres执行CREATE TABLE时,它是遵循指定的列顺序,还是按照字节对齐或性能的最佳顺序重新组织列?

推荐答案

问题1

foo2的性能会因为字节更好而优于foo

是的,列的顺序对性能的影响很小.类型对齐是更重要的因素,因为它会影响磁盘上的占用空间.您可以最小化存储大小(播放"俄罗斯方块列"),并在数据页上压缩更多行,这是提高速度的最重要因素.

通常不值得麻烦.有一个极端的例子,比如在这个相关的答案中,你会得到一个实质性的区别:

类型对齐详细信息:

另一个因素是,如果先有固定大小的列,检索列值的速度会稍快一些.我引用manual here条:

要读取数据,需要依次判断每个属性.第一

有一个开放的TODO item to allow reordering of column positions in the Postgres Wiki,部分是因为这些原因.

问题2

Postgres执行CREATE TABLE时是否遵循列顺序

列存储为in the defined order,系统不会try 优化.

我看不出列顺序与TOAST tables有任何关联,就像另一个答案似乎暗示的那样.

Postgresql相关问答推荐

优化PostgreSQL查询以将用户插入数据库

org.postgresql. util.PSQLException:使用docker + docker—compose + kafka + springboot时try 连接失败

如何在PostgreSQL中对深度嵌套的jsonb属性创建索引

使用jOOQ在postgres上取消嵌套enum_range

使用 pgAdmin 4 v7.4 在 Windows 11 上全新安装 PostgreSQL 15.3-3 无法启动 - 卡在正在加载 pgAdmin 4 v7.4...

包含间隔在 jooq 和 postgres 中没有按预期工作

Postgresql如何从jsonB列的数组中的多个json中 Select 一个值

为什么 postgresql 可以在这个查询中高效地使用索引?

PostgreSQL 中的复制槽是否会阻止删除 WALL,即使它们来自另一个数据库?

psql中set、\set和\pset的区别

Postgres 图像未创建数据库

在查询中的复合外键/主键列上连接表

Postgres 在 WHERE id != int 查询中排除 NULL

在远程机器上Restore dump

gem install pg 无法绑定到 libpq

如何使用 psql 命令列出、创建、使用和判断数据库?

丢弃顺序和级联

如何将表的一列复制到PostgreSQL中比较相同ID的另一表的列

Postgis / Geodjango:无法确定数据库的 PostGIS 版本

Postgres DB 上的整数超出范围