gpt4 book ai didi

postgresql - Postgres 表中的列顺序会影响性能吗?

转载 作者:行者123 更新时间:2023-11-29 11:08:45 24 4
gpt4 key购买 nike

在 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 时,它是遵循指定的列顺序,还是按照字节对齐或性能的最佳顺序重新组织列?

最佳答案

问题一

Will the performance of foo2 be better than foo because of better bytealignment for the columns?

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

通常情况下,这不值得打扰。对于像这个相关答案中这样的极端示例,您会得到很大的不同:

类型对齐细节:

另一个因素是,如果您首先使用固定大小的列,则检索列值会稍微快一些。我引用 manual here :

To read the data you need to examine each attribute in turn. Firstcheck whether the field is NULL according to the null bitmap. If itis, go to the next. Then make sure you have the right alignment. Ifthe field is a fixed width field, then all the bytes are simplyplaced. If it's a variable length field (attlen = -1) then it's a bitmore complicated. All variable-length data types share the commonheader structure struct varlena, which includes the total length ofthe stored value and some flag bits.

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

问题2

When Postgres executes a CREATE TABLE does it follow the column orderspecified or does it re-organize the columns in optimal order for bytealignment or performance?

以定义的顺序存储,系统不会尝试优化。

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

关于postgresql - Postgres 表中的列顺序会影响性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12604744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com