达梦数据库的大表快速加列方法

背景:

开发商反馈给一张数据量为2.9亿,124G的表加字段,非常慢,一个小时都没有执行成功。

解决办法:

达梦数据库提供一个动态会话级参数:ALTER_TABLE_OPT,该参数默认为:0

先查询数据库当前的参数ALTER_TABLE_OPT的值:

复制代码
SELECT PARA_NAME,PARA_VALUE,FILE_VALUE FROM V$DM_INI WHERE PARA_NAME='ALTER_TABLE_OPT';

修改该参数为3:

复制代码
SP_SET_PARA_VALUE(1,'ALTER_TABLE_OPT',3);
或
ALTER SYSTEM SET 'ALTER_TABLE_OPT'=3 BOTH;

说明:该参数修改后,只对新建立连接的会话生效,原本存在的会话无效。
参数优化调整后,再添加字段就毫秒级执行成功。

参数详解:

1)对于添加列,当设置INI参数ALTER_TABLE_OPT为1时,添加列采用查询插入实现,可能会导致ROWID的改变;

2)ALTER_TABLE_OPT 为 2 时,系统开启快速加列功能,对于没有默认值或者默认值为 NULL 的新列,系统内部会标记为附加列,能够达到瞬间加列的效果,此时记录 ROWID 不会改变,若有默认值且默认值不为NULL,则默认值的存储长度不能超过 4000 字节,此时仍旧采取查询插入实现;

3)ALTER_TABLE_OPT 为 3 时,系统会开启快速加列功能,允许指定新增列的默认值,系统会为该列设置附加列标记,查询表中已存在的数据时,会自动为记录设置追加列默认值,此时记录 ROWID 不会改变。
PS:一般建议将该参数直接设置为3即可。

相关推荐
Lhan.zzZ2 小时前
Qt多线程数据库操作:安全分离连接,彻底解决段错误
数据库·c++·qt·安全
攒了一袋星辰3 小时前
类抖音的高并发评论盖楼系统
服务器·前端·数据库
2601_949817723 小时前
使用Django Rest Framework构建API
数据库·django·sqlite
liulilittle3 小时前
SQLITE3 KG-CC
数据库·c++·sqlite
hnlgzb3 小时前
安卓app体系中,room数据库和datastore是什么关系?有什么不一样?
android·数据库·oracle
book_longker3 小时前
postgresql 数据库的安装,配置,备份,恢复
数据库·postgresql
Elastic 中国社区官方博客3 小时前
从判断列表到训练好的 Learning to Rank( LTR )模型
大数据·数据库·人工智能·深度学习·elasticsearch·搜索引擎·全文检索
hutengyi3 小时前
保姆级JavaWeb项目创建、部署、连接数据库(tomcat)
数据库·tomcat·firefox
寰宇的行者3 小时前
深入理解 Django 异步视图中的 `sync_to_async` 与协程
数据库·django