如果用append插入1亿行,回滚的时候会发生什么问题?
2016-12-29 15:53
316 查看
走如果用append插入1亿行,回滚的时候会发生什么问题?
测试:
(1)第一个会话下执行
CREATE TABLE t (a INTEGER);
insert into t select a.object_id from dba_objects a,dba_objects b where rownum <1000000;
(2)新开一个会话执行:
create TABLE t_append (a INTEGER);
insert /+append/into t_append select a.object_id from dba_objects a,dba_objects b where rownum <1000000;
查看append插入的会话的SID
vmystat视图SQL>selectsidfromvmystat where rownum=1;
查看两个表占用的回滚段
SELECT s.USERNAME,s.SID,s.SERIAL#,t.UBAFIL “UBA filenum”, t.UBABLK
“UBA Block number”,t.USED_UBLK “Number os undo Blocks Used”,
t.START_TIME,t.STATUS,t.START_SCNB,t.XIDUSN RollID,r.NAME RollName
FROM vsessions,vtransaction t,v$rollname r
WHERE s.SADDR=t.SES_ADDR AND t.XIDUSN=r.usn
AND s.username=USER;
可以看到APPEND只占用一个回滚段。
现在将两个会话分别rollback或者commit,在两张表创建索引,再执行插入
create index idx_t on t(A);
create index idx_t_append on t_append(A);
查看回滚段
总结:append插入时如果这一列是有索引的话,是分插到不同的索引段,是会占很多索引段的,append直接插入到表没有索引的时候,直接推高高水位。
append的优点:1、减少了redo(redo分为两部分,一部分是对于块的redo,一部分是对于undo的redo,这里减少了undo就减少redo。如果这个表设置的是nologging,dml完全不写redo) 2、减少了undo 3、从高水位插入会比较快(减少了查找块的时间)4、直接写到磁盘,不经过buffer,但是IO增大了
测试:
(1)第一个会话下执行
CREATE TABLE t (a INTEGER);
insert into t select a.object_id from dba_objects a,dba_objects b where rownum <1000000;
(2)新开一个会话执行:
create TABLE t_append (a INTEGER);
insert /+append/into t_append select a.object_id from dba_objects a,dba_objects b where rownum <1000000;
查看append插入的会话的SID
vmystat视图SQL>selectsidfromvmystat where rownum=1;
SID
194
查看两个表占用的回滚段
SELECT s.USERNAME,s.SID,s.SERIAL#,t.UBAFIL “UBA filenum”, t.UBABLK
“UBA Block number”,t.USED_UBLK “Number os undo Blocks Used”,
t.START_TIME,t.STATUS,t.START_SCNB,t.XIDUSN RollID,r.NAME RollName
FROM vsessions,vtransaction t,v$rollname r
WHERE s.SADDR=t.SES_ADDR AND t.XIDUSN=r.usn
AND s.username=USER;
可以看到APPEND只占用一个回滚段。
现在将两个会话分别rollback或者commit,在两张表创建索引,再执行插入
create index idx_t on t(A);
create index idx_t_append on t_append(A);
查看回滚段
总结:append插入时如果这一列是有索引的话,是分插到不同的索引段,是会占很多索引段的,append直接插入到表没有索引的时候,直接推高高水位。
append的优点:1、减少了redo(redo分为两部分,一部分是对于块的redo,一部分是对于undo的redo,这里减少了undo就减少redo。如果这个表设置的是nologging,dml完全不写redo) 2、减少了undo 3、从高水位插入会比较快(减少了查找块的时间)4、直接写到磁盘,不经过buffer,但是IO增大了
相关文章推荐
- 当你输入一个网址的时候,实际会发生什么?(赛门铁克电话面试我,曾经问过这个问题,最后一问,我只能说不知道)
- mysql查询安装目录与安装mysql时候如果遇到什么public key not installed 问题解决方案。
- Spring声明事务的时候如果代码中有commit会发生什么
- 各位朋友,如果您在开发时候遇到什么问题,共同探讨!
- 今天EF插入数据库的时候发生System.NotSupportedException异常问题
- C++ exception throw和catch的时候,发生了什么
- 开机的时候如果出现提示$home/.dmrc无法写入 问题解决方法
- 批评一些大学生的工作观问题——什么时候能踏实?
- 使用.net资源文件时候发生的问题
- 关于append并行插入分区引起锁等待问题
- Struts2学习(四):Action执行的时候发生了什么
- 变态题大串烧:微软面试问题 -- 三.难题:这类题有一定难度,如果得不到答案,也不能说明什么
- 向一个table 插入数据的时候,为什么会从该table所分配的第四个block开始,预留的3个block是干什么用的?
- 解决为VS2008配置调试.NET框架源码的时候安装补丁KB944899(Visual Studio 2008 QFE)失败回滚的问题
- ASP.NET的MEMBERSHIP问题:你在用WEBPART, 登陆控件的时候,可能会发生的数据库连接错误。
- 批评一些大学生的工作观问题——什么时候能踏实?
- 什么时候应该使用Web Service? (我想问,如果在局域网里使用web service+windows程序来开发原来的C/S结构的程序,性能上差多少?)
- 使用Url Rewrite 如果原始Url就带QueryString时候的一个问题
- 当生活比较迷茫的时候,我就会想起这样一个问题,人到底为了什么而活着?
- 批评一些大学生的工作观问题——什么时候能踏实?