PostgreSQL表用户列最大个数

news/2024/7/9 22:03:47 标签: postgresql, 数据库

PostgreSQL表用户列最大个数

有些业务可能有这么个需求:需要增加用户列,即通过ALTER TABLE ... ADD...来添加用户列。那么PG/GP中是否会有列个数的限制呢?

它有1600列数的限制,并且没有方法去除掉这个限制。参见:

  https://github.com/greenplum-db/gpdb/issues/15409

1)接着,我们创建一个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,该函数对此进行限制的地方:

3270919fa74ba419aecaa6dbf00930ad.png

也就是宏MaxHeapAttributeNumber定义:#define MaxHeapAttributeNumber 1600

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

fc0e679a2b4eaf9dd256b89c793ec383.png

Drop表时会对该字段进行更新吗?接着检查函数ATExecDropColumn,该函数将列删除后,并没有更新pg_class系统表的relnatts字段。OK,知道为什么删除一列,仍旧不能添加新列了吧。

6)如果,我们在ATExecDropColumn的地方将pg_class系统表进行更新,将该限制规避掉,是否可行?

需要知道,drop一列后,存于磁盘上表内的记录仍旧是完整列,也就是包含删除的列。在扫描时会将所有列值都扫描出来,投影时将删除的列去掉。修改后的后果:实际列超出1600,此时会对其他流程带来异常吗?

随便找下MaxHeapAttributeNumber使用的地方,比如toast_insert_or_update函数:

5e8eeaf08cd25c62dfc30562a5da8240.png

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


http://www.niftyadmin.cn/n/335029.html

相关文章

【C++初阶】模板

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C初阶 ⭐代码仓库:C初阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…

Android ANativeWindow 渲染画面

ANativeWindow 是 Android NDK(Native Development Kit)提供的一个C/C编程接口,用于与底层的图形系统进行交互,实现图像渲染和处理等功能。 使用方法:上层用 SurfaceView,传递 SurfaceView 的 Surface 给 n…

Ajax加强(xhr、XML、JSON、xhr上传文件)

文章目录 一、XMLHttpRequest的基本使用1、 使用xhr发起GET请求2、了解xhr对象的readyState属性3、使用xhr发起带参数的GET请求4、查询字符串5、URL编码与解码6、使用xhr发起POST请求 二、数据交换格式1、XML(1)XML和HTML的区别(2&#xff09…

网络的基本理解

网络的基本理解 文章目录 网络的基本理解局域网因特网IP地址端口路由器域名DNS服务器代理 角色:张三、李四、王五 局域网 某天张三购买了一个电脑,此时还没有网络,只有电脑,电脑是一个独立的个体,只能自己使用&#x…

第十七章 使用PXE+Kickstart无人值守安装服务

文章目录 第十七章 使用PXEKickstart无人值守安装服务一、无人值守系统1、无人值守安装系统的工作流程2、PXE介绍 二、部署相关服务程序1、临时关闭防火墙2、配置DHCP服务程序(1)、安装dhcp服务程序(2)、编辑配置文件(…

一个实际音视频开发问题!

前言: 大家好,今天给大家分享的内容是关于平时在做音频编解码会遇到的一些问题,比如说: 解码播放的时候,播不出来解码播放的时候,画面有条纹编码的时候,修改分辨率大小,没有反应 这三…

Python3 MySQL

要在Python 3中使用MySQL数据库,你可以使用mysql-connector-python库。这是官方提供的MySQL数据库驱动程序,用于在Python中连接和操作MySQL数据库。 以下是一个简单的示例,演示如何连接到MySQL数据库并执行查询: 首先&#xff0…

GPT专业应用:自动撰写宣传稿

●图片由Lexica 生成,输入:Staff working on product promotion 宣传稿是指按照有关政策文件或相关精神,以宣传某种主张、某项工作、某件事情等为目的,为获得理解、支持而撰写的应用文。基本格式包含四个要素,分别是标…