Oracle NoLogging Append 方式减少批量insert的redo_size

业务处理中,很多时候使用实表临时表处理中间结果,而实表的Insert操作缺省会记录redo log,针对此问题收集相关测试总结信息如下:

【转】 常见dml、ddl语句使用nologging选项所生成的redo和undo大小比较


DDL/DML Operations


Direct-path


nologging


parallel


Noarchivelog Redo


Noarchivelog Undo


Archivelog Redo


Archivelog Undo


Insert into XXX select * from YYY


N


N


N


19076324


627240


18938620


612980


Alter table XXX nologging;

Insert into XXX select * from YYY;


N


Y


N


19085860


631584


18935548


612912


Insert /*+ append */ into XXX select * from YYY


Y


N


N


26628


4048(only metadata)


19145656


4048


Alter table XXX nologging;

Insert /*+ append */ into XXX select * from YYY


Y


Y


N


26868


4048(only metadata)


26836


4048


Create table XXX as select * from YYY


Y


N


N


77624


18500


19162220


15468


Create table XXX nologging as select * from YYY


Y


Y


N


52160


11176


52408


11248


Alter table XXX move nologging;


N


Y


N


36288


6208


36576


6208


Alter table XXX move;


N


N


N


39788


7288


19154024


5972


Create index XXX


N


N


N


21280


1864


3093616


1888


Create index XXX nologging


N


Y


N


22264


2208


22620


2232


update XXX set


N


N


N


122903212


47987880


122403692


47786680


Update /*+ parallel(5) */ XXX set


N


N


Y(Queries)


121629928


46706296


120818336


46466056


Alter table XXX nologging;

update XXX set


N


Y


N


123155288


48006404


110396512


41617700


Alter table XXX nologging;

update /*+ parallel(5) */ XXX set


N


Y


Y(Queries)


119748064


46152324


120205036


46261536


Alter session enable parallel dml

Update /*+ parallel(5) */ XXX set


N


N


Y(DML)


59846488


24680220


59740516


24611672


Alter table XXX nologging;

Alter session enable parallel dml

Update /*+ parallel(5) */ XXX set


N


Y


Y(DML)


59831756


24673396


59717116


24602628


delete XXX;


N


N


N


60684720


37650208


61770472


38254648


delete /*+parallel(5) */ XXX;


N


N


Y(Queries)


60685416


37650436


61988568


38461832


Alter table XXX nologging;

delete XXX;


N


Y


N


60684956


37650216


61989984


38460424


Alter table XXX nologging;

delete /*+parallel(5) */ XXX;


N


Y


Y(Queries)


60685092


37650224


61986156


38459172


Alter session enable parallel dml

delete /*+parallel(5) */ aabbn;


N


N


Y(DML)


65072896


40990412


61979216


38457372


Alter table XXX nologging;

Alter session enable parallel dml

delete /*+parallel(5) */ aabbn;


N


Y


Y(DML)


65073828


40998048


62022668


38500548

                 

结论:

1、insert into:非direct方式下noarchivelog和archivelog两种模式均产生大量undo、redo;direct方式下noarchivelog模式均产生少量undo、redo;direct+logging方式下archivelog模式产生少量undo、大量redo;direct+nologging方式下archivelog模式产生少量undo、少量redo

2、create table as:CTAS本身就是一种direct的操作,CTAS+logging方式下noarchivelog模式产生少量redo、少量undo;CTAS+nologging方式下noarchivelog模式产生更少量redo、更少量undo;CTAS+logging方式下archivelog模式产生少量undo、大量redo;CTAS+nologging方式下archivelog模式产生少量undo、少量redo

3、alter table ... move:nologging方式下noarchivelog模式产生少量undo、少量redo;nologging方式下archivelog模式产生少量undo、少量redo;logging方式下archivelog模式产生少量undo、大量redo

4、create index:logging+nologging方式下noarchivelog模式产生少量undo、少量redo;logging方式下archivelog模式产生少量undo、大量redo;nologging方式下archivelog模式产生少量undo、少量redo

5、update:enable parallel方式下,noarchivelog+ archivelog模式生成少量undo、少量redo;非enable parallel方式下,noarchivelog+ archivelog模式生成大量undo、大量redo

6、delete:任何组合都会生成大量undo、大量redo

其他参考列表:

1) Nologging到底何时才能生效? http://www.eygle.com/faq/Nologging&append.htm

2) Oracle 减少redo size的方法

非归档模式下:append能大量减少redo量。

归档模式下:在表空间和数据库级非force logging模式下,表如果是nologging,则append能大量减少redo量。

时间: 2024-10-10 17:27:10

Oracle NoLogging Append 方式减少批量insert的redo_size的相关文章

Oracle中append与Nologging

快速向表中插入大量数据Oracle中append与Nologging 2017-05-05 / VIEWS: 304 来源于:http://blog.sina.com.cn/s/blog_61cd89f60102e7gi.html 当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候,oracle需要生成 redo log和undo log;此时最好的解决办法是用insert, 并且将表设置为nologging;当把表设为nologging后,并且使用的inse

oracle nologging用法(转)

一.oracle日志模式分为(logging,force logging,nologging) 默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nologging是尽量减少日志.FORCE LOGGING可以在数据库级别.表空间级别进行设定.而LOGGING与NOLOGGING可以在表级别设定. 注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLO

oracle nologging用法

一.oracle日志模式分为(logging,force logging,nologging) 默认情况是logging,就是会记录到redo日志中,force logging是强制记录日志,nologging是尽量减少日志.FORCE LOGGING可以在数据库级别.表空间级别进行设定.而LOGGING与NOLOGGING可以在表级别设定. 注:FORCE LOGGING并不比一般的LOGGING记录的日志多,数据库在FORCE LOGGING状态下,NOLOGGING选项将无效,因为NOLO

ORACLE NOLOGGING研究

熟悉oracle的人都知道,通过设置oracle的nologging选项,可以使某些操作快速完成,风险是数据库备份可能失效.可以使用nologging的操作有很多,搜集资料整理如下: 1.索引的创建和ALTER(重建). 2.表的批量INSERT(通过/*+append */提示使用“直接路径插入“.或采用SQL*Loader直接路径加载).表数据生成少量redo,但是所有索引修改会生成大量redo(尽管表不生成日志,但这个表上的索引却会生成redo!). 3.Lob操作(对大对象的更新不必生成

Oracle 的 FORALL用法(批量增删改)

FORALL语句的一个关键性改进,它可大大简化代码,并且对于那些要在PL/SQL程序中更新很多行数据的程序来说,它可显著提高其性能. 1: 用FORALL来增强DML的处理能力 Oracle为Oracle8i中的PL/SQL引入了两个新的数据操纵语言(DML)语句:BULK COLLECT和FORALL.这两个语句在PL/SQL内部进行一种数组处理 :BULK COLLECT提供对数据的高速检索,FORALL可大大改进INSERT.UPDATE和DELETE操作的性能.Oracle数据库使用这些

Mybatis批量Insert及水平分表

首先是Mybatis批量insert 说一下核心部分,整个工程参考我的github,运行的main方法在org/xiongmaotailang/mybatis/batchinsert/DbUtil.java中,涉及到的脚本是sql.txt 需要的数据表示例,包括4个字段. CREATE TABLE `newspvuv` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `pv` bigint(11) DEFAULT NULL,   `uv`

Oracle Table连接方式分析

Oracle Table连接方式分析 表连接基本知识: 1.哪张表将驱动查询(即访问的第一张表)?按照指定的路径查询,何时将访问到没一张表?可选的驱动路径有哪些? 2.可能出现哪些Oracle连接?记住:在Oracle中,连接顺序.可选的索引.用于排序和建立散列表的可用内存的不同都会导致不同的结果. 3.哪些索引是可用的?哪些索引是可选的?索引的选择不仅仅将导致优化器使用或者限制一个索引,还将改变驱动查询的方式,并可能决定使用或者限制查询中其他的索引. 4.哪些提示提供了可选的路径?哪些提示限制

用Jquery动态append方式加入标签时Css样式丢失的解决方法

一般在Jquery中会用下面的方式来添加新标签: var obj = "<fieldset data-role='controlgroup' data-type='vertical' data-role='fieldcontain'> <input id='menu0" type='checkbox'/><label for='menu0'> 复选框 </label> </fieldset>";  //按个人要求拼接

以Append方式打开文件,设置偏移量无效

1 #include<stdio.h> 2 3 int main() 4 { 5 FILE * fd = fopen("btoo1.c", "ab+"); 6 fpos_t p ; 7 int fp = fgetpos(fd, &p); 8 printf("bef seek: fgetpos = %ld, ftell = %d\n", p, ftell(fd)); 9 fseek(fd, 12, SEEK_SET); 10 f