insert 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
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9700459/viewspace-631240/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9700459/viewspace-631240/
insert append需要注意的一个小问题相关推荐
- springboot mybatis easyui 整合的一个小demo
springboot mybatis easyui 整合的一个小demo 这是最终完成界面 话不多说 开整! 这是项目结构 数据库 表结构和数据库 (有点乱 之前本来是个正经图书表的 = =.) /* ...
- 电商总结(八)如何打造一个小而精的电商网站架构
前面写过一些电商网站相关的文章,这几天有时间,就把之前写得网站架构相关的文章,总结整理一下.把以前的一些内容就连贯起来,这样也能系统的知道,一个最小的电商平台是怎么一步步搭建起来的.对以前的文章感兴趣 ...
- Pygame:编写一个小游戏
大学最后的考试终于结束了,迎来了暑假和大四的漫长的"自由"假期.当然要自己好好"玩玩"了. 我最近在学习Python,本意是在机器学习深度学习上使用Python ...
- 如何打造一个小而精的电商网站架构?
本文大纲: 1. 小型电商网站的架构 2. 日志与监控系统的解决方案 3. 构建数据库的主从架构 4. 基于共享存储的图片服务器架构 5. 移动M站建设 6. 系统容量预估 7. 缓存系统 一.小型电 ...
- 给 OpenPOP.Net 加一个小功能,可用于收取邮件时监测数据流量!
/* 最近写了一个自动收邮件的机器人,原来一开始偷懒"娶"了 COM 组件 JMail: <封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集), ...
- trietree的一个小练习
trietree又称为字典树.顾名思义,它是一种用来快速查找字符串的树形数据结构. 借用下网上的图哈~trietree结构如下: 实现方式大多为数组实现.我觉得这里需要注意的有这么几点: 1.当一个字 ...
- insert /*+ APPEND */
总结得出以下3点结论: a.非归档模式下,只需append就能大量减少redo的产生:归档模式下,只有append+nologging才能大量减少redo. b.insert /*+ append * ...
- java 如何将数字倒置_每日一个小算法之整数中每位上的数字进行反转 20190810
题目要求: 给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出 ...
- Java一个小练习----String类型转换int类型
Java一个小练习 把字符串str分割程String数组,然后转换成int数组,排序 String str = "123 345 89 93 2 6573 223" 然后在拼接成一 ...
- Hiberate中Update和Merge的一个小的区别
1.Update和Merge的一个小区别总结 Update方法:如果要更新的对象是持久态而且在DirtyCheck的时候没有发现改变,那么就不发Update语句.如果更新的对象是游离态即使对象没有改变 ...
最新文章
- Easyui combobox下拉框默认选中第一项
- 清除图片下默认的小间隙_密封间隙对迷宫密封性能影响的三维数值分析
- 数字图像处理笔记一 - 图像采集(空间分辨率和幅度分辨率)
- PL/SQL导入/导出dmp文件-Oracle表空间不一致
- 中国联通华东云数据中心—电气培训
- PostgreSQL-PL/pgSQL
- 做网管这么久了,每个月只是拿1000元的工资
- python的复数实部和虚部都是整数_Python(一)
- 微课|中学生可以这样学Python(3.1节):单分支选择结构
- linux驱动编写(nand flash驱动)
- 键盘拆开重新安装步骤_机械键盘小白入门工具
- mysql自带计划任务
- matlab数学实验 课件,MATLAB数学实验课件.PPT
- 火狐浏览器Firefox Firefox中的xpi文件是什么
- WeWork中国实现全面本土化运营;巴黎欧莱雅沙龙专属全球首家旗舰沙龙开业 | 美通企业日报...
- 依赖计算机英语作文,2011年高考英语卷写作表达题目范文汇总(39):过度依赖电脑的弊端...
- 集线器、交换机、路由器、中继器及网关、网桥之间的区别
- Sailfish 浏览器是基于 Gecko 引擎开发
- FCM 模糊C均值聚类算法
- 物联网的2018,百花齐放的一年
热门文章
- 微信个性化菜单 java_微信公众平台开发(109) 个性化菜单
- H3C交换机版本升级
- python工资条教程_我用python帮朋友写了一个“制作工资条”的自动化程序!网友说:真棒!...
- 软件测试研究生院校排名,自动化专业考研学校有哪些 最新考研院校排名
- 端端Clouduolc与百度云盘等公有云同步的区别
- 固态硬盘数据恢复教您如何操作
- mvp的全称_王者荣耀里面每把有mvp但是mvp是什么意思呢
- android 我叫mt 插件,叉叉我叫MT助手
- IE8浏览器访问百度首页,输入关键字,点击“百度一下”,搜索内容出现在一个自动打开的新窗口的问题的一个原因
- 怎么关闭火狐浏览器的百度辅助模式(无障碍服务)