我在添加一列到表格上遇到了问题。
我尝试运行了几次,但是在运行超过10分钟后,我决定取消查询,因为锁定时间太长。
有用信息:
- PostgreSQL版本:9.1 - 行数:约250K - 列数:38 - 可空列数:32 - 约束数:5(1 PK,3 FK,1 UNIQUE) - 索引数:1 - 操作系统类型:Debian Squeeze 64
我发现有趣的信息,关于PostgreSQL如何管理可空列(通过HeapTupleHeader)。
我的第一个猜测是,因为这个表已经有32个可空列,并且每个8位的
因此,添加一个新的可空列可能需要更新每一行的HeapTupleHeader,以添加一个新的8位
所以我尝试修改一个可空列(实际上并不可空),以便将可空列的数量减少到31,以检查我的猜测是否正确。
很不幸,这个修改也花了很长时间,超过了5分钟,所以我也中止了它。
你有没有想法是什么原因导致了这个性能损耗?
我尝试运行了几次,但是在运行超过10分钟后,我决定取消查询,因为锁定时间太长。
ALTER TABLE mytable ADD mycolumn VARCHAR(50);
有用信息:
- PostgreSQL版本:9.1 - 行数:约250K - 列数:38 - 可空列数:32 - 约束数:5(1 PK,3 FK,1 UNIQUE) - 索引数:1 - 操作系统类型:Debian Squeeze 64
我发现有趣的信息,关于PostgreSQL如何管理可空列(通过HeapTupleHeader)。
我的第一个猜测是,因为这个表已经有32个可空列,并且每个8位的
MAXALIGN
,所以HeapTupleHeader的长度为4字节(未经验证,也不知道如何验证)。因此,添加一个新的可空列可能需要更新每一行的HeapTupleHeader,以添加一个新的8位
MAXALIGN
,这可能会导致性能问题。所以我尝试修改一个可空列(实际上并不可空),以便将可空列的数量减少到31,以检查我的猜测是否正确。
ALTER TABLE mytable ALTER myothercolumn SET NOT NULL;
很不幸,这个修改也花了很长时间,超过了5分钟,所以我也中止了它。
你有没有想法是什么原因导致了这个性能损耗?