PostgreSQL表用户列最大个数

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PostgreSQL表用户列最大个数

PostgreSQL表用户列最大个数有些业务可能有这么个需求:需要增加用户列,即通过ALTER TABLE ... ADD...来添加用户列。那么PG/GP中是否会有列个数的限制呢?它有1600列数的限制,并且没有方法去除掉这个限制。参见:  https://github.com/greenplum-db/gpdb/issues/154091)接着,我们创建一个1600列的表,进行下验证:


CREATE TABLE t1(id1 int,id2 int,id3 int,...,id1600 int);

2)然后,添加一列:



test=# alter table t1 add column co1601 int;
psql: ERROR: table can have at most 1600 columns

会报错提示,表最大有1600列。此时如果再添加新列怎么办?能否添加呢?3)我们drop一列,然后再添加一列,是否可以?


test=# alter table t1 drop column co1600;
ALTER TABLE
test=# alter table t1 add column co1600 int;
psql: ERROR: table can have at most 1600 columns

显然,并不能通过这种方式添加新列。4)在我们认知中,删除掉一列,不是就空出一个名额了么,咋还不给添加新列?GP issues中对此进行了讨论:  https://github.com/greenplum-db/gpdb/issues/15459显然,官方也没有计划对此行为进行修复。Dropped columns are not removed from catalog. That's the behavior we inherit from upstream and avoids rewrite of table during drop column. So, no plans for now to modify the behavior. Understand it can be annoying. We are considering enhancing the behavior for Columnar tables to such reuse of dropped column for newly added columns. For now, closing the issue.5)那么我们能否在代码中去掉这个限制,是否对其他地方有影响呢?先看下,在什么地方限制的:添加列的函数ATExecAddColumn,该函数对此进行限制的地方:

也就是宏MaxHeapAttributeNumber定义:#define MaxHeapAttributeNumber 1600从上图可以看到限制的值来自pg_class系统表的relnatts字段。新增字段时,会对该字段进行更新:仍旧是ATExecAddColumn函数中:

Drop表时会对该字段进行更新吗?接着检查函数ATExecDropColumn,该函数将列删除后,并没有更新pg_class系统表的relnatts字段。OK,知道为什么删除一列,仍旧不能添加新列了吧。6)如果,我们在ATExecDropColumn的地方将pg_class系统表进行更新,将该限制规避掉,是否可行?需要知道,drop一列后,存于磁盘上表内的记录仍旧是完整列,也就是包含删除的列。在扫描时会将所有列值都扫描出来,投影时将删除的列去掉。修改后的后果:实际列超出1600,此时会对其他流程带来异常吗?随便找下MaxHeapAttributeNumber使用的地方,比如toast_insert_or_update函数:

可以看到,有2个问题。如果修改这个限制的化,不是那么简单在drop列后更新pg_class系统表的relnatts字段值就可以的,需要仔细梳理代码,对其他流程受影响的地方都进行改造。当然,能否改造也需要打个问号,方便起见,还是对业务进行优化吧。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
29天前
|
SQL 关系型数据库 PostgreSQL
把PostgreSQL的表导入SQLite
把PostgreSQL的表导入SQLite
19 0
|
6月前
|
SQL 关系型数据库 数据库
postgresql中连接两张表更新第三张表(updata)
如何结合两张表的数据来更新第三张表
70 0
|
5月前
|
关系型数据库 数据库 PostgreSQL
postgresql | 数据库| 生成2000W条的简单测试表
postgresql | 数据库| 生成2000W条的简单测试表
27 0
|
8月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL从表回收站中恢复误删的表
PolarDB MySQL提供表回收站的功能,删除的表会被临时转移到表回收站,本案例教您从表回收站恢复误删的表。
223 0
|
10月前
|
存储 缓存 关系型数据库
PostgreSQL可拔插存储引擎表定义机制
PostgreSQL可拔插存储引擎表定义机制
171 0
|
10月前
|
存储 关系型数据库 PostgreSQL
PostgreSQL表扫描方法解析
PostgreSQL表扫描方法解析
74 0
|
10月前
|
存储 NoSQL 关系型数据库
PostgreSQL 12的可拔插存储引擎--表访问方法以及bloackholes案例
PostgreSQL 12的可拔插存储引擎--表访问方法以及bloackholes案例
123 0
|
12月前
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 12 查找当前数据库的所有表
postgresql 获取schema,table 信息
226 0
|
12月前
|
SQL 关系型数据库 数据库
PostgreSQL 12 文档: 系统表
系统目录是关系型数据库存放模式元数据的地方,比如表和列的信息,以及内部统计信息等。PostgreSQL的系统目录就是普通表。你可以删除并重建这些表、增加列、插入和更新数值, 然后彻底把你的系统搞垮。 通常情况下,我们不应该手工修改系统目录,通常有SQL命令可以做这些事情。(例如,CREATE DATABASE向 pg_database表插入一行 — 并且实际上在磁盘上创建该数据库。)。 有几种特别深奥的操作例外,但是随着时间的流逝其中的很多也可以用 SQL 命令来完成,因此对系统目录直接修改的需求也越来越小。
77 0
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 删除数据表
PostgreSQL 删除数据表
289 0