PostgreSQL:额外列的性能影响

PostgreSQL:额外列的性能影响,sql,database,performance,postgresql,Sql,Database,Performance,Postgresql,给定一个大表(1000-1亿行),向其中添加一些额外(未索引)列的最佳方法是什么 只需添加列 为每个额外列创建一个单独的表,并在需要访问额外值时使用联接 答案是否会根据额外列是密集的(大部分不是空的)还是稀疏的(大部分是空的)而变化?具有null值的列可以添加到行中,而不会对数据页的其余部分进行任何更改。在空位图中只需设置一位。因此,是的,在大多数情况下,添加稀疏列要便宜得多 为附加列创建一个单独的1:1表是否是一个好主意取决于用例。一般来说比较贵。对于初学者来说,每行有28字节的开销(堆元组头

给定一个大表(1000-1亿行),向其中添加一些额外(未索引)列的最佳方法是什么

  • 只需添加列
  • 为每个额外列创建一个单独的表,并在需要访问额外值时使用联接
    答案是否会根据额外列是密集的(大部分不是空的)还是稀疏的(大部分是空的)而变化?

    具有
    null
    值的列可以添加到行中,而不会对数据页的其余部分进行任何更改。在空位图中只需设置一位。因此,是的,在大多数情况下,添加稀疏列要便宜得多

    为附加列创建一个单独的1:1表是否是一个好主意取决于用例。一般来说比较贵。对于初学者来说,每行有28字节的开销(堆元组头加上项标识符),每表有一些额外的开销。在查询中
    连接
    行也比一块读取要昂贵得多。您需要添加主键/外键列以及索引。如果在大多数查询中不需要额外的列,那么拆分可能是一个好主意。通常这是个坏主意

    在PostgreSQL中添加列很快更新列中的值可能很昂贵,因为每次
    更新
    都会写入一个新行(由于型号不同)。因此,一次更新多个列是一个好主意

    如何计算行大小:


    每行有28字节的开销(heaptuple头加上项目指针)和每表的一些额外开销
    请确认,这是否意味着一个包含三个4字节整数(主键+2个外键)的直通表每行需要28+12字节?@DavidTan:实际上,每行总共需要44字节。24+4+3*4+4字节的对齐填充。我在上面添加了更多详细解释的链接。