百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Oracle改变表结构的时候当表里有几亿行数据的时候,速度很慢吗

moboyou 2025-04-05 18:39 14 浏览

在Oracle中,对包含几亿行数据的表进行结构变更(DDL操作)时,速度可能**显著变慢**,甚至导致业务中断。其性能瓶颈主要来自**数据量、锁机制、I/O压力**以及操作类型。以下是详细分析和解决方案:

---

### ** 一、为什么大表结构变更会变慢?**

1. **全表数据扫描与写入**

- 例如添加非空列(带默认值)、修改列类型、删除列等操作,需**逐行更新所有数据块**,导致高I/O负载。

- 若表有**数亿行数据**,物理写入耗时可能达数小时甚至更久。

2. **锁机制阻塞**

- Oracle的DDL操作通常需要**排他锁(Exclusive Lock)**,在变更期间:

- 其他会话无法修改表数据(DML阻塞)。

- 长时间锁表会导致应用超时或事务回滚。

3. **Undo/Redo日志压力**

- 大表DDL会生成海量Undo和Redo日志,可能撑满日志文件空间,导致数据库挂起。

4. **索引维护**

- 若表有索引,结构变更后需重建索引,进一步延长操作时间。

---

### ** 二、优化策略与解决方案**

#### **1. 优先使用在线DDL(Online Redefinition)**

- **原理**:通过`DBMS_REDEFINITION`包创建临时影子表,逐步同步数据,最终原子化切换表定义,**减少锁表时间**。

- **适用场景**:添加/删除列、修改列类型、分区表重构等。

- **核心步骤**:

```sql

-- 1. 启动在线重定义

BEGIN

DBMS_REDEFINITION.START_REDEF_TABLE(

uname => 'SCHEMA_NAME',

orig_table => 'BIG_TABLE',

int_table => 'BIG_TABLE_TMP'

);

END;


-- 2. 同步增量数据(多次执行减少最终切换时间)

BEGIN

DBMS_REDEFINITION.SYNC_INTERIM_TABLE(

uname => 'SCHEMA_NAME',

orig_table => 'BIG_TABLE',

int_table => 'BIG_TABLE_TMP'

);

END;


-- 3. 完成重定义

BEGIN

DBMS_REDEFINITION.FINISH_REDEF_TABLE(

uname => 'SCHEMA_NAME',

orig_table => 'BIG_TABLE',

int_table => 'BIG_TABLE_TMP'

);

END;

```

- **优势**:业务几乎无感知(仅`FINISH`阶段短暂锁表)。

---

#### **2. 分阶段操作(适用非关键列变更)**

- **添加可为空的列**:直接执行`ALTER TABLE ADD COLUMN`,仅更新数据字典,**秒级完成**。

- **后续填充数据**:通过增量更新或后台任务分批设置默认值,避免单次操作压力。

```sql

-- 分批次更新(使用ROWID范围)

UPDATE /*+ PARALLEL(8) */ big_table

SET new_column = 'default_value'

WHERE ROWID BETWEEN start_rowid AND end_rowid;

```

---

#### **3. 利用分区表特性**

- 若表已分区,可**按分区逐个操作**,降低单次数据量。

- **示例**(交换分区):

```sql

-- 创建临时分区表

CREATE TABLE big_table_tmp PARTITION BY RANGE (date_col) ... ;


-- 逐个分区交换数据

ALTER TABLE big_table

EXCHANGE PARTITION p202301

WITH TABLE big_table_tmp

INCLUDING INDEXES;

```

---

#### **4. 并行处理(Parallel DDL)**

- 启用并行执行加速操作(需足够CPU和I/O资源):

```sql

ALTER TABLE big_table MOVE PARALLEL 8;

ALTER INDEX idx_big_table REBUILD PARALLEL 8;

```

- **注意**:操作完成后需关闭并行度,避免后续查询资源争用:

```sql

ALTER TABLE big_table NOPARALLEL;

```

---

#### **5. 预分配存储与优化I/O**

- 确保表空间和数据文件有足够空间,避免扩展中断。

- 使用高性能存储(如SSD),或临时将表迁移到高吞吐磁盘组。

---

### ** 三、注意事项**

1. **风险评估**:

- 提前检查表依赖对象(触发器、物化视图、外键等)。

- 备份表数据(`CREATE TABLE backup AS SELECT * FROM big_table`)。

2. **监控与回退**:

- 实时监控进度(`V$SESSION_LONGOPS`)。

- 准备回退脚本,防止意外中断。

3. **维护窗口选择**:

- 在业务低峰期操作,避免高峰期锁表引发故障。

---

### ** 四、性能对比(示例)**

| **操作类型** | 传统DDL耗时 | 在线重定义耗时 |

|---------------------------|-------------|----------------|

| 添加非空列(带默认值) | 8小时 | 20分钟(仅切换)|

| 修改列类型(VARCHAR2增大) | 12小时 | 1小时 |

| 删除列 | 6小时 | 15分钟 |

---

**总结**:对亿级大表进行结构变更,**优先选择在线重定义**,结合分区和并行技术,可将停机时间从小时级压缩到分钟级。务必提前验证方案并做好应急预案! #Oracle优化 #DDL性能 #数据库管理

相关推荐

php通过IP地址查询详细信息_php根据ip获取位置

前言:以前找过很多查询ip地址信息的工具,有的没有经纬度,有的没有国外的信息。现在本人制作的这个可以查询全国ip的信息,并且给出ip地址所在地的经纬度信息!以下为php程序代码截图...

今晚拿下PHP反序列化的一系列操作

引言在CTF中反序列化类型的题目还是比较常见的,之前有学习过简单的反序列化,以及简单pop链的构造。这次学习内容为php内置的原生类的反序列化以及一点进阶知识。在题目给的的代码中找不到可利用的类时,这...

关于 PHP 启动 MongoDb 找不到指定模块问题

前言:最近有一个小demo,需要通过PHP将用户行为记录储存到MongoDB,再用Spark做协同过滤。由于以前处理跨语言交互是通过消息中间件,这次本地使用MongoDB却弄出了几个问...

PHP8中查询数组中指定元素-PHP8知识详解

php是使用最广泛的web编程语言,数组是一个数据集合,数组是一种非常常用的数据类型。在操作数组时,有时我们需要查询数组中是否有某个指定元素。在实际的程序开发中,我们用到了下列方法来查询数组中指定的元...

通过代码执行或命令执行写Shell_命令执行和代码执行

公众号:白帽子左一专注分享渗透经验,干货技巧...本文由团队手电筒分享,如果你还是个小白担心看不懂,没关系,“三步写马””如何上传木马”“如何拿下服务器并妥善管理”等实战内容可以结合视频观看,视频演示...

ThinkPHP6初步搭建API服务_thinkphp6 api

ThinkPHP6正式发布已有一小段时间,按照官方文档实操了一遍。中间也遇到些小问题,在网上找解决方案花费了一些时间。本次分享整理了ThinkPHP6从头开始部署的详细操作步骤,希望能够帮助大家节省探...

第②章 在逃火锅难民与椒盐喷嚏_椒盐蛋解说我的世界

意识像沉在深海的破船,一点一点被光线和声音打捞上来。林琳,不,现在是李琳琅了,躺在宽大得能跑马的雕花拔步床上,瞪着头顶繁复的藻井彩绘,第无数次确认自己不是在做梦。鼻腔里充斥着淡淡的、混合了药味、熏...

美团外卖特征平台的建设与实践_美团外卖的技术分析

随着美团外卖业务的发展,算法模型也在不断演进迭代中。本文从特征框架演进、特征生产、特征获取计算以及训练样本生成四个方面介绍了美团外卖特征平台在建设与实践中的思考和优化思路。1背景美团外卖业务种类繁多...

分库分表实战(第2期):最初的我们——了解一下单库外卖订单系统

前言上一期内容我们整体了解了分库分表实战项目当前使用的系统架构,也就是单库版本订单系统的系统架构。同时,我们也知道了未来要做的分库分表版本的订单系统架构。现在,我们就从单库版本的订单系统开始,一步一...

“美团外卖小哥帮崩溃程序员写代码”视频遭质疑:自编自导自演

来源:三言财经近日,有网友质疑走红网络的“青岛外卖小哥帮崩溃程序员写代码”的视频是一起策划。有网友认为,就算是行业人员转行送外卖,一上手就能看懂对方的代码并开始马上写的行为太假;还有网友表示,配音搞成...

HarmonyOS NEXT仓颉开发语言实战案例:外卖App

各位周末好,今天为大家来仓颉语言外卖App的实战分享。我们可以先分析一下页面的布局结构,它是由导航栏和List容器组成的。幽蓝君目前依然没有找到仓颉语言导航栏的系统组件,还是要自定义,这个导航栏有三部...

蛋糕房外卖小程序烘焙店点餐外卖小程序微信小程序源码饮品店

基于微信小程序的外卖点餐的设计与实现-计算机毕业设计源码

摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了微信小程序外卖点餐的设计与实现的开发全过程。通过分析微信小程序外卖点餐的设计与实现管理的不足,创建了一个...

外卖源码和外卖平台系统租赁有什么区别?

外卖源码和外卖平台系统租赁是两种不同的模式,它们之间有什么区别?我们来看看吧。1.概念不同:外卖源码是指一种软件源代码,包括了外卖平台的核心代码、框架、功能模块等,需要用户自己进行二次开发和定制。更...

Java项目本地部署宝塔搭建实战java外卖小程序源码

大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套java开发的外卖小程序源码,这套系统已经完成了线下配送的大部分功能,适合学习与二次开发。技术架构技术框架:springboot+ssm...