天天看点

《Oracle高性能自动化运维》一一3.4 Redo优化

3.4 redo优化

从前面的内容可以知道,oracle redo的产生主要是由dml事务引起的,与dml事务相关的数据库更改主要包含:

数据块更改;

回滚段数据块镜像更新;

数据库内部信息更新(数据字典表更新)。

可以通过日志挖掘获取数据库更改的相关信息,如下:

《Oracle高性能自动化运维》一一3.4 Redo优化
《Oracle高性能自动化运维》一一3.4 Redo优化

可以看到,redo中记录了dml事物的数据块更改、回滚段更新等信息。因此,可以考虑采取以下措施来减少redo的产生,从而达到优化redo的目的:

减少索引键更新操作;

减少大表(键)更新操作;

使用direct load加载数据;

使用nologging进行特定操作;

使用临时表(temporary table);;

使用外部表(external table);

批量化处理dml业务程序;

减少事务commit次数,采用组提交的方式;

减少select for update显示锁定,可以明显减少redo产生;

减少表记录的数量规模(利用分区路由架构分区裁剪特性),例如使用分区、分表、分库等策略;

减少不必要的dml操作可以减少redo产生,例如改写、整合sql程序,优化业务逻辑。

可以通过下面的示例验证优化的可行性。

(1)采用组提交减少redo的产生

不采用组提交插入数据:

《Oracle高性能自动化运维》一一3.4 Redo优化
《Oracle高性能自动化运维》一一3.4 Redo优化

采用组提交(提交一次)插入数据:

《Oracle高性能自动化运维》一一3.4 Redo优化
《Oracle高性能自动化运维》一一3.4 Redo优化

从上述数据可以看出:

不采用组提交产生redo:9268980;

采用组提交产生redo:5241596;

组提交大大减少了redo的产生:4027384(9268980-5241596)。

(2)采用临时表可以减少redo产生

采用普通表插入数据:

《Oracle高性能自动化运维》一一3.4 Redo优化
《Oracle高性能自动化运维》一一3.4 Redo优化

采用全局临时表插入数据:

《Oracle高性能自动化运维》一一3.4 Redo优化

普通表产生redo:5479300;

全局临时表产生redo:1607268;

全局临时表大大减少了redo产生:3872032(5479300-1607268)。

可以看到,采用组提交和使用临时表都能有效减少redo的产生,从而提升数据库的性能。有兴趣的读者可以尝试采用其他措施进行扩展验证。