oracle nologging append 注意
转载自:http://www.blogjava.net/xzclog/archive/2010/10/28/336383.html
oracle nologging append 注意
1. append方式添加记录对insert into ... values语句不起作用。
2. 以append方式批量插入的记录,其存储位置在hwm 之上,即使hwm之下存在空闲块也不能使用。
3. 以append方式插入记录后,要执行commit,才能对表进行查询。否则会出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
4. 在归档模式下,要把表设置为nologging,然后以append方式批量添加记录,才会显著减少redo数量。在非归档模式下,不必设置表的nologging属性,即可减少redo数量。如果表上有索引,则append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大。
用insert append可以实现直接路径加载,速度比常规加载方式快。但有一点需要注意: insert append时在表上加“6”类型的锁,会阻塞表上的所有DML语句。因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据,并不一定会提高速度。因为每一时刻只能有一个进程在加载(排它锁造成)。
SQL> create table test as select * from dba_objects where 1=2;
表已创建。
SQL> insert into test select * from dba_objects;
已创建11344行。
SQL> set lines 150
SQL> col object_type for a10
SQL> col object for a30
SQL> col username for a10
SQL> col osuser for a10
SQL> col program for a30
SQL> col sid for 99,999
SQL> col locked_mode for 99
SQL> col spid for 999,999
SQL> select o.object_type,o.owner||'.'||o.object_name object,s.sid,s.serial#,p.spid,s.username,s.osuser,s.program,l.lock
ed_mode
2 from v$locked_object l,dba_objects o,v$session s,v$process p
3 where l.object_id = o.object_id
4 and s.sid=l.session_id
5 and s.paddr=p.addr
6 and o.object_name = upper('&obj');
输入 obj 的值: test
原值 6: and o.object_name = upper('&obj')
新值 6: and o.object_name = upper('test')
OBJECT_TYP OBJECT SID SERIAL# SPID USERNAME OSUSER PROGRAM
LOCKED_MODE
---------- ------------------------------ ------- ---------- ------------ ---------- ---------- ------------------------
------ -----------
TABLE SYS.TEST 147 19 784 SYS CNPEKALT02 sqlplus.exe
3
2\jyu
可以看到,insert 时在表上加的是“3”类型的锁。
SQL> rollback;
回退已完成。
SQL> insert /*+ append */ into test select * from dba_objects;
已创建11344行。
SQL> set lines 150
SQL> col object_type for a10
SQL> col object for a30
SQL> col username for a10
SQL> col osuser for a10
SQL> col program for a30
SQL> col sid for 99,999
SQL> col locked_mode for 99
SQL> col spid for 999,999
SQL> select o.object_type,o.owner||'.'||o.object_name object,s.sid,s.serial#,p.spid,s.username,s.osuser,s.program,l.lock
ed_mode
2 from v$locked_object l,dba_objects o,v$session s,v$process p
3 where l.object_id = o.object_id
4 and s.sid=l.session_id
5 and s.paddr=p.addr
6 and o.object_name = upper('&obj');
输入 obj 的值: test
原值 6: and o.object_name = upper('&obj')
新值 6: and o.object_name = upper('test')
OBJECT_TYP OBJECT SID SERIAL# SPID USERNAME OSUSER PROGRAM
LOCKED_MODE
---------- ------------------------------ ------- ---------- ------------ ---------- ---------- ------------------------
------ -----------
TABLE SYS.TEST 147 19 784 SYS CNPEKALT02 sqlplus.exe
6
2\jyu
而执行insert append时在表上加的是“6”类型的锁。
insert append与一般的insert在表上加的锁不一样。insert append加的是exclusive的锁。因此要注意在执行insert append尽快提交,否则会阻塞其它事务对同一张表的DML语句。
此外, ORA-12838:是由于在执行insert append之后没有提交或回滚,接着又执行DML语句造成的。解决办法是在insert append 之后加上commit或rollback。
请看下面的测试:
SQL> delete from test;
已删除9831行。
SQL> insert /*+ append */ into test select * from temp_fsum_od;
已创建3277行。
SQL> insert into test select * from temp_fsum_od;
insert into test select * from temp_fsum_od
*
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL> update test set OD_CODE=upper(OD_CODE) ;
update test set OD_CODE=upper(OD_CODE)
*
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL> delete from test;
delete from test
*
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL>
SQL> insert /*+ append */ into test select * from temp_fsum_od;
insert /*+ append */ into test select * from temp_fsum_od
*
第 1 行出现错误:
ORA-12838: 无法在并行模式下修改之后读/修改对象
注意,我先执行了一个delete语句,又执行了insert append. 这个delete语句并没有造成后面的insert append报错。
但在我执行了一个insert append之后,再执行任何DML语句都会报错。
这说明,在执行了insert append 之后,必须commit或rollback,才能再执行其它DML语句。
但在insert append之前可以执行DML语句,而不会对insert append造成影响。
所以我们注意一点就可以了,即只要业务允许,在执行insert
insert append方法的使用
create table arch (status varchar(2)) nologging; ----- create a nologging table
Table created
Table created
select a.name, b.value
from v$statname a, v$mystat b
where a.statistic# = b.statistic#
and a.name = 'redo size'
and b.value > 0; ----- view redo engross space
---------------------------------------------------------------- ----------
redo size 1332780
insert into arch select 'ok' from dba_objects
---------------------------------------------------------------- ----------
redo size 1744516 ----- +411736
insert into arch1 select 'ok' from dba_objects
---------------------------------------------------------------- ----------
redo size 2156000 ------ +411484
insert /*+append*/ into arch select 'ok' from dba_objects
---------------------------------------------------------------- ----------
redo size 2169864 ----- +13864
insert /*+append*/ into arch1 select 'ok' from dba_objects
---------------------------------------------------------------- ----------
redo size 2555448 ----- +385584
create table arch (status varchar(2)) nologging; ----- create a nologging table
Table created
Table created
---------------------------------------------------------------- ----------
redo size 33208
---------------------------------------------------------------- ----------
redo size 444704 ----- +411496
insert into arch1 select 'ok' from dba_objects
---------------------------------------------------------------- ----------
redo size 856160 ----- +411456
insert /*+append*/ into arch select 'ok' from dba_objects
---- view redo engross space
---------------------------------------------------------------- ----------
redo size 870024 ----- +13864
insert /*+append*/ into arch1 select 'ok' from dba_objects
---- view redo engross space
---------------------------------------------------------------- ----------
redo size 884004----- +13980
oracle nologging append 注意相关推荐
- Oracle NoLogging Append 方式减少批量insert的redo_size
业务处理中,很多时候使用实表临时表处理中间结果,而实表的Insert操作缺省会记录redo log,针对此问题收集相关测试总结信息如下: [转] 常见dml.ddl语句使用nologging选项所生成 ...
- 【Oracle】快速向表中插入大量数据Oracle中append与Nologging
当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候,oracle需要生成 redo log和undo log;此时最好的解决办法是用insert, 并且将表设置为n ...
- 快速向表中插入大量数据Oracle中append与Nologgin的作用
当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候,oracle需要生成 redo log和undo log;此时最好的解决办法是用insert, 并且将表设置为n ...
- 今晚直播:Oracle Nologging 全面总结
本分享从三个 Nologging 相关的问题切入,全面讲解 Oracle 对 Logging 与 Nologging 在各个不同层面的控制,并通过实验演示 Nologging 操作以及对 standb ...
- 【Oracle】append
我们在生产环境中经常遇到需要往表中插入大量数据的情况,怎么样才能让插入数据的速度变快呢?Oracle中的append简直就是神器!!没图说个**,直接上图: 是不是看晕了?哈哈,莫慌,请看下面总结: ...
- oracle数据库 append,oracle中insert,copy,insert append执行对比
oracle中insert,copy,insert append执行对比 还是由于迁移数据库,测试了insert,copy,insert append的执行速度. 环境:oracle9i向oracle ...
- 在线重定义分区表和NOLOGGING APPEND分区表对比
1.模拟大表 create table tes_p (it int, ic int, im varchar2(20)); declare i number(10); begin for ...
- 【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较...
[知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 [知识点整理]Oracle中NOLOGGING.APPEND.AR ...
- 【知识点整理】NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较...
[知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 ...
- insert oracle速度,[Oracle] Insert into速度测试nologging+parallel
C:\Users\Admin>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 10月 4 13:24:0 ...
最新文章
- JQuery笔记(一)
- 124. Leetcode 583. 两个字符串的删除操作 (动态规划- 字符串系列)
- 中科院分词系统(NLPIR)JAVA简易教程
- 外媒称Windows 10是一辆“广告大巴车”
- boost::range模块replaced相关的测试程序
- Java技术:为什么不推荐使用BeanUtils属性转换工具
- 根据经纬度算出两个位置之间的距离
- Oracle在Solaris下的机能与调整简介
- Unity3D ARPG网络游戏编程实践
- 洛谷P4135 作诗 --分块基础
- 经典排序算法(七)--冒泡排序Bubble Sort
- Bat批处理命令大全
- 文本转成图片(自动换行、自定义字体),图片抗锯齿优化,图片压缩优化
- hzk16 8 16c语言示例,[资料共享]汉字库HZK16的使用,强烈推荐: 486959c6.rar
- 【WPS表格】数据透视表:统计各商品及各分店的销售总额
- 图形《R数据可视化手册》中文PDF源代码+《R数据科学》中文PDF源代码
- 朋友圈那个随便辞职的年轻人,后来活成了什么样?
- 字体图标在服务器上显示不出来,fontawesome图标字体库组件在服务器上显示不出来图标的解决...
- 计算机专业论文在线教育,在线教育系统 计算机毕业论文.doc
- 出行助手Vue项目中高德API的使用
热门文章
- 2020年小米高级 PHP 工程师面试题
- fanc 机器人_24个FANUC机器人的视觉功能详细介绍
- 计算机进入低能耗休眠状态,BIOS电源管理ACPI的D3cold-D3hot
- ggplot多图叠加_R作图 ggplot2图片的布局排版
- 3月第1周易盾业务风控关注 | 治理升级,让“标题党”、流量造假等网络乱象走开
- 邮件中的 请看附件 请知悉,英语怎么说 要比较正式的用语
- mybatis学习4
- python找到长度最长的单词长度,python中的正则表达式:查找长度为n或更长的单词...
- 神舟Z8-SP7D1驱动安装
- [计算机网络]十、TCP的拥塞控制和4个计时器、常用协议原理和命令