那天接到一个事情,我们的数据库表空间已经快用完了,我们需要将一个3GB的表里的数据转储到历史表里去,3天干完。但是我们因为是给运营商服务的,所以白天是绝对不能做这个事情的,只能晚上干,这就要求我们必须尽可能的提高效率。有同事提议使用nologging和append提高效率,但是nologging和append是不是能够提高效率呢。我查询了官方文档,有这么一个描述:
Conventional INSERT is the default in serial mode. In serial mode, direct path can be used only if you include the APPEND hint.
Direct-path INSERT is the default in parallel mode. In parallel mode, conventional insert can be used only if you specify the NOAPPEND hint.
In direct-path INSERT, data is appended to the end of the table, rather than using existing space currently allocated to the table. As a result, direct-path INSERT can be considerably faster than conventional INSERT.
原来append模式的原理就是将数据直接插到表的最后,而不是插入到表的空闲空间中,这样从算法上讲,是一个很简单的算法,所以效率会提高不少。但是还是做个试验,验证一下吧。
实验环境:windows7 x64,oracle11gR2,归档模式。
实验一:append和nologging对insert的影响。
1 建立试验用表。
create table test1 as select * from dba_objects;
2 记录现在系统中的redo size:select name, value from v$sysstat where name = 'redo size';
现在系统的redo size为:915021984。
3 普通模式插表,记录之后的redo size以及时间:
insert into test1 (select * from dba_objects);
commit;
现在的redo size为:936621172
耗用时间为:1.264秒
这个操作产生的redo为:21599188
4 drop掉试验表,重建该表,使用nologging hint,记录前后的redo size:
insert /*+ nologging*/ into test1 (select * from dba_objects);
commit;
插入之前的redo size:953810184
插入之后的redo size:962152616
耗时:1.092秒
这个操作产生的redo为:8342432。
5 drop该表,重建之。以append hint插入:
插入之前的redo size:997153368
插入之后的redo size:1005655116
耗时:1.014秒
该操作产生的redo:8501748
6 drop该表,重建之。将表调整为nologging模式,以append hint插入:
alter table test1 nologging;
insert /*+ append*/ into test1 (select * from dba_objects);
commit;
插入之前的redo size:988037948
插入之后的redo size:988156952
操作耗时:1.029秒
这个操作产生的redo为:119004。
实验一的总结:从第四步可以很明显的看出来,使用nologging hint插表,效率可以得到很大的提升,我这个试验表比较小,在时间上还看不出明显的区别,但是如果放在生产环境上,从redo size的产生情况就可以看出,nologging模式对效率的提升应该是非常可观的。从第五步就能看出,使用append hint也可以很好的提升效率。但是,如果nologging和append一起使用,效果更好,产生的redo比之前述两种更是少了一个数量级,比直接插入少了两个数量级。不过,在实际的生产环境中,表的模式不能随意更改,因此有时候也只能使用nologging模式来做最可能的性能优化。
任何性能的提升总要有一定的牺牲。如果append hint能很好的提高效率,为什么oracle不会直接默认就选择它?这个问题依我浅见,应该是担心产生磁盘碎片。虽说以后的插入会使用现有的空闲空间,但是我估计这种操作会产生碎片的概率要远远高于普通插入。具体的资料我还没有找到,如果找到了,一定即使在这里说。
如果各位能够给我讲解一二,小弟不胜荣幸。
发表评论
-
简介如何查看执行计划以及执行计划的准确性
2012-02-24 20:52 0很多朋友都问过我优化SQL的事情。我觉得在我不 ... -
关于分区表的初探
2012-02-12 00:26 826上周我写了一 ... -
使用WITH提高查询效率
2012-01-15 21:02 1127前两天的业务 ... -
好用的函数sign和decode
2012-01-08 00:11 792今天遇到了一个问题,需要对比一个字段和5的大 ... -
有关LGWR
2011-12-28 21:37 916今天群里有人问关于数据库进程的事情,当然,他对 ... -
安装oracle时还需要修改的几个文件和参数
2011-12-24 23:31 896安装oracle时还需要修改的几个文件和参数: /et ... -
关于oracle的启动
2011-12-24 22:51 602有这么一道题,是关于在实例启动的时候,哪些 ... -
实用语句之一——Oracle建立Database Link
2011-12-18 12:56 811create database link dblink_ ... -
Oracle控制文件的一点研究
2011-12-13 23:15 636控制文件是非常重要的文件,实例读取控制文件才 ... -
SQL语句的执行过程
2011-12-13 21:20 750服务器接收到SQL语句之后,要经过如下步骤完成操作:P ... -
OCP题库笔记1z0-052
2011-12-12 23:24 10641 关于undo 数据库可以有一个以上的undo表空间; ... -
计算索引碎片的一个脚本
2011-12-11 10:36 574今天在网上看到了一个估计索引碎片的方法,所以写了个小 ... -
索引不可用的情况
2011-12-11 10:35 702有一天我遇到了一个同事的求助,他让我帮忙优化一个SQ ... -
如何理解oracle实例(instance)和数据库(database)的概念
2011-12-11 10:34 695今天群里有朋友问什么是instance,什么是data ...
相关推荐
BLOG_Oracle_lhr_【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较BLOG_Oracle_lhr_【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行...
oracle nologging全面总结,从数据库级别,对象以及表级别都有说明,以及在生产环境的影响,和及时止损的处理方法。
UPDATE 1、先备份数据(安全、提高性能)。2、分批更新,小批量提交,防止锁表。3、如果被更新的自动有索引,更新的数据量很大,先取消索引,再重新创建。4、全表数据更新,如果表非常大,建议以创建新表的形式替代...
Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...
abator 生成ibaties dao xml 生成命令
profile和bashrc比较测试, 结论:bashrc文件可以在nologging状态下生效,而profile文件不可以
10.2.6 LOGGING和NOLOGGING 348 10.2.7 INITRANS和MAXTRANS 349 10.3 堆组织表 349 10.4 索引组织表 352 10.5 索引聚簇表 368 10.6 散列聚簇表 376 10.7 有序散列聚簇表 386 10.8 嵌套表 390 10.8.1 嵌套表...
ORA-14102: 只能指定一个 LOGGING 或 NOLOGGING 子句 安装补丁:8795792补丁 oracle
实验22:dml语句,插入删除和修改表的数据 49 实验23:事务的概念和事务的控制 52 实验24:在表上建立不同类型的约束 54 实验25:序列的概念和使用 58 实验26:建立和使用视图 60 实验27:查询结果的集合操作 63 ...
导入/导出是ORACLE幸存的最古老的两个命令行工具,其实我从来不认为Exp/Imp是一种好的备份方式,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理...
抽丝剥茧_一起有关新冠病毒疫情的勒索病毒案例 从内存故障到CPU过高Oracle诊断案例(上) 从内存故障到CPU过高Oracle诊断案例(下) 从纸上谈兵到躬行实践-shared pool道法器术 高并发Oracle OLTP系统的故障案例分享 ...
org.apache.ibatis.logging.nologging org.apache.ibatis.logging.slf4j org.apache.ibatis.logging.stdout 对象适配器设计模式 2.异常 org.apache.ibatis.exceptions 3.缓存 org.apache.ibatis.cache org.apache...
sql> [logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0 sql> maxextents 50); <3>.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of ...
1. 启动主数据库的强制日志记录功能,避免Nologging子句的影响 ALTER DATABASE FORCE LOGGING; 2. 配置日志传递的安全认证 一般情况,设定remote_login_passwordfile=exclusive,并且配置tnsnames.ora即可 3. 配置主...
oracle 分区表学习及应用示例Create table(创建分区表) ... storage(initial 100k next 100k minextents 1 maxextents unlimited pctincrease 0) nologging; grant all on bill_monthfee_zero to dxsq_dev;
源代码和有关更新.......................................................................... 29 勘误表....................................................................................... 29 配置环境....
│ │ │ frame-sourcefiles-org.apache.ibatis.logging.nologging.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.slf4j.html │ │ │ frame-sourcefiles-org.apache.ibatis.logging.stdout.html │ ...