当须要对一个很是大的表INSERT的时候,会消耗很是多的资源,由于update表的时候,oracle须要生成 redo log和undo log;此时最好的解决办法是用insert, 而且将表设置为nologging;当把表设为nologging后,而且使用的insert时,速度是最快的,这个时候oracle只会生成最低限度的必须的redo log,而没有一点undo信息。若是有可能将index也删除,重建
1.alter table table_name nologging;
2. insert into table_name select * from xxxx; html
对此有了更好的解决方法:sql
一、alter table nologging;
注释:Nologging的设置跟数据库的运行模式有关
a、查询当前数据库的归档状态:
select name,log_mode from v$database;
默认为 NOARCHIVELOG 非归档
b、nologging在归档模式下有效,非归档模式nologging不起什么做用
c、为了提升插入的速度,咱们能够对表关闭写log功能。 SQL 以下:数据库
二、drop掉索引约束之类的;数据结构
三、 使用直接插入的方式oracle
insert/*+append+*/into tb_name select colnam1,colname2 from table_name; app
a,数据库处于归档模式:当表模式为logging状态时,不管是否使用append模式,都会生成redo.当表模式为nologging状态时,只有append模式,不会生成redo。性能
数据库处于非归档模式:不管是在logging仍是nologing的模式下,append的模式都不会生成redo,而no append模式下都会生成redo。 测试
b,建议不要常用append,这样表空间会一直在高水位上,除非你这个表只插不删日志
c,在使用了append选项之后,insert数据会直接加到表的最后面,而不会在表的空闲块中插入数据。htm
使用append会增长数据插入的速度。
的做用是在表的高水位上分配空间,再也不使用表的extent中的空余空间
append 属于direct insert,归档模式下append+table nologging会大量减小日志,
非归档模式append会大量减小日志,append方式插入只会产生不多的undo
不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。
4,总结
测试证实:
1. 无论哪一种模式下append要与nologging方式联用才能达到很好的效果。
2. 非归档与归档方式,只用NOLOGGING是不起效果的。
3. 非归档下append已达到不错的效果,但不及与nologging的联用方式。
4. 归档下单append起不到效果。
NOLOGGING插完后最好作个备份。
另外,若是库处在FORCELOGGING模式下,此时的nologging方式是无效的。
Oracle数据库有联机重作日志,这个日志是记录对数据库所作的修改,好比插入,删除,更新数据等,对这些操做都会记录在联机重作日志里。通常数据库至少要有2个联机重作日志组。当一个联机重作日志组被写满的时候,就会发生日志切换,这时联机重作日志组2成为当前使用的日志,当联机重作日志组2写满的时候,又会发生日志切换,去写联机重作日志组1,就这样反复进行。
若是数据库处于非归档模式,联机日志在切换时就会丢弃. 而在归档模式下,当发生日志切换的时候,被切换的日志会进行归档。好比,当前在使用联机重作日志1,当1写满的时候,发生日志切换,开始写联机重作日志2,这时联机重作日志1的内容会被拷贝到另一个指定的目录下。这个目录叫作归档目录,拷贝的文件叫归档重作日志。
数据库使用归档方式运行时才能够进行灾难性恢复。
1.归档日志模式和非归档日志模式的区别
非归档模式只能作冷备份,而且恢复时只能作彻底备份.最近一次彻底备份到系统出错期间的数据不能恢复.
归档模式能够作热备份,而且能够作增量备份,能够作部分恢复.
原文连接:https://www.cnblogs.com/tdskee/p/8607474.html
redo与undo
1. 什么是redo(用于重作数据)
redo也就是重作日志文件(redo log file),Oracle维护着两类重作日志文件:在线(online)重作日志文件和归档(archived)重作日志文件。这两类重作日志文件都用于恢复;其主要目的是,万一实例失败或介质失败,它们可以恢复数据。 因为数据库缓冲,对磁盘数据的更新不是实时的,可是对redo日志的更新会在commit以后确切发生。 若是在事务提交以后,磁盘数据更新以前,系统发生故障,好比断电,系统重启以后会将那些已经写入redo,可是没有更新到磁盘的数据进行重作,这样系统就恢复到故障点以前了。 redo日志默认3组,循环写入,第一组(每一个组全部成员同时写入一样的信息)满了,切换到第二个,第二个满了切换到第三个,当全部组都写满以后,日志进程再次开始写第一个,后面的数据覆盖前面的数据,即为非归档模式。 鉴于redo如此重要,须要将已写满的日志归档,即复制内容到其余地方,即开启归档日志模式,可是会影响系统性能。
2. 什么是undo(用于回滚数据)
从概念上讲,undo正好与redo相对。你对数据执行修改时,数据库会生成undo信息,这样万一你执行的事务或语句因为某种缘由失败了,或者若是你用一条ROLLBACK语句请求回滚,就能够利用这些undo信息将数据放回到修改前的样子。redo用于在失败时重放事务(即恢复事务),undo则用于取消一条语句或一组语句的做用。 undo保存在undo表空间中,且包含在redo日志中。 当执行DML操做时,旧数据会写入undo中。 事务回滚,未提交时,rollback,把undo中的旧数据从新写回数据段中;已提交时,进行闪回(flashback)操做 ,大多都是基于undo数据实现的。读一致性:用户检索数据时,ORACLE老是使用户只能看到被提交过的数据(当前事务中的其余语句能够看到未提交的数据),或者特定时间点的数据(select语句时间点)。当某个用户在此查询点以后修改了数据,此查询读到这个数据时,就是经过在undo中读取来实现的。 oracle使用scn来实现读一致性,系统变化号(SCN)是一个数据结构,它定义了一个给定时刻提交的数据库版本,SCN能够被认为是oracle的逻辑时钟,每一次提交数值都要增长。