insert /*+python append insert*/为什么会提高性能

相关文章推荐
转自:http://blog.csdn.net/cnham/article/details/5486424/*+append*/
append 属于direct insert,归档模式下ap...
在归档模式和非归档模式下,设定表为logging和nologging,测量普通的insert 和insert /*+append*/生成redo大小。第一次测试我对下列结果报怀疑态度,于是又重新测试一...
对于logging的理解总是以为表的日志设置为NO它就不会去产生日志了,其实不是的下面是对于logging的一些解释和试验。 Logging介绍 可以采用nologging模式执行以下操作:1.索引的...
from:http://space.itpub.net/?uid-9240380-action-viewspace-itemid-753150
SQL> create table t_test(...
转自:/Linux/08.htm
在上一篇的blog中 做了下使用,在归档和非归档下,做数据插入http://blog.csdn.net/guogang83/article/details/9219479。结论是在非归档模式下表设置为...
Insert语句加/*+APPEND*/ hint在循环中单条提交,由于/*+APPEND */ hint是在高水位线以上插入的特性,导致每提交一次,就会取一个新的block存放,高水位就上推一个bl...
在速度上面大家都清楚直接加载插入数据确实比insert into快多了,但是如果在业务很麻烦的表这样做,估计会付出很大的性能甚至夯机的代价,
也许开发追求快,但是作为DB,要考虑在性能的基础上来追求...
那天接到一个事情,我们的数据库表空间已经快用完了,我们需要将一个3GB的表里的数据转储到历史表里去,3天干完。但是我们因为是给运营商服务的,所以白天是绝对不能做这个事情的,只能晚上干,这就要求我们必须...
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)博客访问: 3129
博文数量: 3
注册时间:
认证徽章:
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux
原文地址: 作者:
使用append提示进行insert叫做直接路径加载插入。
1、使用这种提示因为系统不去查找freelist链表中的空闲块,直接在高水标记位以上插入数据,因此速度比较快。但若是对于经常delete的表,浪费磁盘空间太大!
2、它不记录日志,因此一旦插入的数据在没有保存回磁盘的时候发生掉电之类的状况插入的数据不能重做。
3、/*+append*/后,需要马上提交,否则会影响下一次修改失败(insert,update,delete)
在Oracle Database 10g Enterprise Edition Release 10.2.0.1.0中,如果插入操作的语法是
insert /*+append*/ into XXX values(XXX);
那么系统加的是row exclusive锁,也就是正常insert所加的行级锁,但是如果插入操作的语法是
insert /*+append*/ into XXX select XXX from XXX;
那么系统加的是exclusive锁,相当于表级锁,加表级锁意味着在本会话没有commit的时候其他任何会话都不能再进行insert,update,delete操作
【相关SQL语句】
检查数据库归档模式(NOARCHIVELOG、ARCHIVELOG):
Archive log list
SELECT log_mode from v$
查看当前redo日志大小:
select name,value,class from v$sysstat where name='redo size';
或者打开统计,这个更准确地统计当前语句生成的redo,推荐使用
set autotrace traceonly statistics
普通插入方式:
insert into t select * from dba_
append插入方式:
insert /*+append*/ into t select * from dba_
Append+nologing插入方式:
insert /*+append*/ into t nologging select * from dba_
【测试结论】
1、无论归档模式、还是非归档模式,append+nologing插入方式效果最好,生成最小的redo日志
2、非归档模式下,append插入模式效果不错
3、归档模式下,append插入模式没有效果
【测试例子】
【我的测试】
从以下对比可以看出,增加hint方法,速度增加4倍。
还真的有这么神,都是万行的表拷贝,我的测试如下:
insert into p_nbsc_ho1 select * from p_nbsc_ho (消耗时间73分钟)
insert /*+append*/ into p_nbsc_ho2 select * from p_nbsc_ho (消耗时间7分钟)
insert /*+append*/ 如果不commit的话,会对该表加6级锁,也就是说,即使此时select 这个表都会报错。
因此append提示的语句首先不能是业务表,其次要尽快提交commit,所以一般情况不敢用hint了。
阅读(312) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。下次自动登录
现在的位置:
& 综合 & 正文
insert /*+ APPEND */
总结得出以下3点结论:a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。b、insert /*+ append */ 时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM enqueue上使用模式3(row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),这使其他DML在直接路径加载期间将被阻塞。c、insert /*+ append */ 直接路径加载,速度比常规加载方式快。因为是从HWM的位置开始插入,也许会造成空间浪费。
数据库版本:SQL& select * from v$BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE
11.2.0.1.0
ProductionTNS for Linux: Version 11.2.0.1.0 - ProductionNLSRTL Version 11.2.0.1.0 - Production
网上说测试时不要使用auto trace来查看redo size,这个值是有偏差的.建议建立一个视图:SQL& create or replace view redo_size
select value
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = 'redo size';视图已创建。
一、非归档模式SQL& archive log list数据库日志模式
非存档模式自动存档
禁用存档终点
USE_DB_RECOVERY_FILE_DEST最早的联机日志序列
95当前日志序列
1、nologging表SQL& create table test1 nologging as select * from dba_objects where 1=0;表已创建。
SQL& select * from redo_
VALUE----------
SQL& insert into test1 select * from dba_已创建72753行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test1 select * from dba_已创建72753行。
SQL& select * from redo_
VALUE----------
SQL& select (16916) redo_append , (14940) redo_REDO_APPEND REDO_NORMAL----------- -----------
2、logging表:SQL& create table test2 as select * from dba_objects where 1=0;
表已创建。
SQL& select * from redo_
VALUE----------
SQL& insert into test2 select * from dba_
已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test2 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& select (75336) redo_append , (73348) redo_REDO_APPEND REDO_NORMAL----------- -----------
二、归档模式下:
SQL& shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE例程已经关闭。SQL& startup mountORACLE例程已经启动。
Total System Global Area
bytesFixed Size
1337324 bytesVariable Size
bytesDatabase Buffers
bytesRedo Buffers
5971968 bytes数据库装载完毕。SQL& alter数据库已更改。
SQL&数据库已更改。
SQL& archive log list数据库日志模式
存档模式自动存档
启用存档终点
USE_DB_RECOVERY_FILE_DEST最早的联机日志序列
95下一个存档日志序列
97当前日志序列
1、nologging表SQL& select * from redo_
VALUE----------
SQL& insert into test1 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test1 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& select (0972) redo_append , (36) redo_REDO_APPEND REDO_NORMAL----------- -----------
2、logging表SQL& select * from redo_
VALUE----------
SQL& insert into test2 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test2 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& select (79516) redo_append , (6780) redo_REDO_APPEND REDO_NORMAL----------- -----------
在归档模式下,对于常规表的insert append产生和insert同样的redo此时的insert append实际上并不会有性能提高.但是此时的append是生效了的。
三、insert /*+ append */会阻塞除select以外的DML语句,direct-path insert操作是单独一个事务。SQL& select count(*) from test2;
COUNT(*)----------
SQL& insert into test2 select * from dba_已创建72754行。
SQL& select count(*) from test2;
COUNT(*)----------
SQL& insert /*+ APPEND */ into test2 select * from dba_已创建72754行
同一个session下:
SQL& select count(*) from test2;select count(*) from test2*第 1 行出现错误:ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL&提交完成。
SQL& select count(*) from test2;
COUNT(*)----------
SQL& insert /*+ APPEND */ into test2 select * from dba_已创建72754行。
SQL& shutdown immediateORA-01097: 无法在事务处理过程中关闭 - 请首先提交或回退
SQL& select
* from v$mystat where rownum&2;
SID STATISTIC#
---------- ---------- ----------
SQL& select KADDR,TYPE,LMODE from v$lock where sid=224;
---------------- -- ----------
另外开启一个会话,就会发现只能select,其他DML全部阻塞。
总结得出以下3点结论:a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。b、insert /*+ append */ 时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM enqueue上使用模式3(row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),这使其他DML在直接路径加载期间将被阻塞。c、insert /*+ append */ 直接路径加载,速度比常规加载方式快。因为是从HWM的位置开始插入,也许会造成空间浪费。
数据库版本:SQL& select * from v$BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE
11.2.0.1.0
ProductionTNS for Linux: Version 11.2.0.1.0 - ProductionNLSRTL Version 11.2.0.1.0 - Production
网上说测试时不要使用auto trace来查看redo size,这个值是有偏差的.建议建立一个视图:SQL& create or replace view redo_size
select value
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = 'redo size';视图已创建。
一、非归档模式SQL& archive log list数据库日志模式
非存档模式自动存档
禁用存档终点
USE_DB_RECOVERY_FILE_DEST最早的联机日志序列
95当前日志序列
1、nologging表SQL& create table test1 nologging as select * from dba_objects where 1=0;表已创建。
SQL& select * from redo_
VALUE----------
SQL& insert into test1 select * from dba_已创建72753行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test1 select * from dba_已创建72753行。
SQL& select * from redo_
VALUE----------
SQL& select (16916) redo_append , (14940) redo_REDO_APPEND REDO_NORMAL----------- -----------
2、logging表:SQL& create table test2 as select * from dba_objects where 1=0;
表已创建。
SQL& select * from redo_
VALUE----------
SQL& insert into test2 select * from dba_
已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test2 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& select (75336) redo_append , (73348) redo_REDO_APPEND REDO_NORMAL----------- -----------
二、归档模式下:
SQL& shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE例程已经关闭。SQL& startup mountORACLE例程已经启动。
Total System Global Area
bytesFixed Size
1337324 bytesVariable Size
bytesDatabase Buffers
bytesRedo Buffers
5971968 bytes数据库装载完毕。SQL& alter数据库已更改。
SQL&数据库已更改。
SQL& archive log list数据库日志模式
存档模式自动存档
启用存档终点
USE_DB_RECOVERY_FILE_DEST最早的联机日志序列
95下一个存档日志序列
97当前日志序列
1、nologging表SQL& select * from redo_
VALUE----------
SQL& insert into test1 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test1 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& select (0972) redo_append , (36) redo_REDO_APPEND REDO_NORMAL----------- -----------
2、logging表SQL& select * from redo_
VALUE----------
SQL& insert into test2 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& insert /*+ APPEND */
into test2 select * from dba_已创建72754行。
SQL& select * from redo_
VALUE----------
SQL& select (79516) redo_append , (6780) redo_REDO_APPEND REDO_NORMAL----------- -----------
在归档模式下,对于常规表的insert append产生和insert同样的redo此时的insert append实际上并不会有性能提高.但是此时的append是生效了的。
三、insert /*+ append */会阻塞除select以外的DML语句,direct-path insert操作是单独一个事务。SQL& select count(*) from test2;
COUNT(*)----------
SQL& insert into test2 select * from dba_已创建72754行。
SQL& select count(*) from test2;
COUNT(*)----------
SQL& insert /*+ APPEND */ into test2 select * from dba_已创建72754行
同一个session下:
SQL& select count(*) from test2;select count(*) from test2*第 1 行出现错误:ORA-12838: 无法在并行模式下修改之后读/修改对象
SQL&提交完成。
SQL& select count(*) from test2;
COUNT(*)----------
SQL& insert /*+ APPEND */ into test2 select * from dba_已创建72754行。
SQL& shutdown immediateORA-01097: 无法在事务处理过程中关闭 - 请首先提交或回退
SQL& select
* from v$mystat where rownum&2;
SID STATISTIC#
---------- ---------- ----------
SQL& select KADDR,TYPE,LMODE from v$lock where sid=224;
---------------- -- ----------
另外开启一个会话,就会发现只能select,其他DML全部阻塞。
&&&&推荐文章:
【上篇】【下篇】2771人阅读
数据库(9)
在归档模式和非归档模式下,设定表为logging和nologging,测量普通的insert 和insert /*+append*/生成redo大小。第一次我对下列结果报怀疑态度,于是又重新测试一遍,结果差不多,想想是测试的数量太少。如果是在正式环境上做数据迁移,最好就选择最后一种模式。
&&&&&&&&&&&& 模式
普通insert下redo生成量(Byte)
insert/*+append*/下redo生成量(Byte)
非归档模式(表logging)
非归档模式(表nologging)
归档模式(表logging)
归档模式(表nologging)
1.&&&&&&非归档模式
SQL& create view m_redo as
from v$sysstat, v$statname
where v$sysstat.statistic# =v$statname.statistic#
and v$statname.name ='redo size';
SQL& create table test as select * from dba_objects where 1=0;
1.1表为logging
SQL& select * from
----------
SQL& insert into test select * from dba_
已创建50325行。
SQL& select * from
----------
SQL& select (/1024||'M'
---------------------
SQL& select * from
----------
SQL& insert /*+append*/
into test select * from dba_
已创建50325行。
SQL& select * from
----------
SQL& select (4/1024||'M'
--------------------
1.2表为nologging
SQL& alter
SQL& select * from
----------
SQL& insert into test select * from dba_
已创建50325行。
SQL& select * from
----------
SQL& select (9/1024||'M'
--------------------
SQL& select * from
----------
SQL& insert /*+append*/
into test select * from dba_
已创建50325行。
SQL& select * from
----------
SQL& select (3/1024||'M'
--------------------
2.&&&&&&归档模式
&在重新开一个session
SQL& conn test/test
SQL&shutdown immediate
SQL&startup mount
SQL&alter database archivelog
1.1&&表为logging
表被截断。
SQL& select * from m_
----------
SQL& insert into test select * from dba_
已创建50325行。
SQL& select * from m_
----------
SQL& select (848)/||'M'
(848)/1024
---------------------
SQL& select * from m_
----------
SQL& insert /*+append*/ into test select * from dba_
已创建50325行。
SQL& select * from m_
----------
SQL& select (/1024||'M'
----------------
1.2&&表为nologging
SQL& alter
表已更改。
SQL& select * from m_
----------
SQL& insert into test select * from dba_
已创建50325行。
SQL& select * from m_
----------
SQL& select (/1024||'M'
---------------------
SQL& select * from m_
----------
SQL& insert /*+append*/ into test select * from dba_
已创建50325行。
SQL& select * from m_
----------
SQL& select (3/1024||'M'
--------------------
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:256958次
积分:4024
积分:4024
排名:第8729名
原创:140篇
转载:104篇
评论:17条
(3)(1)(24)(5)(3)(6)(10)(10)(15)(9)(6)(7)(24)(6)(5)(13)(47)(28)(12)(2)(2)(5)(5)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
作挨踢的....
主要是oracle erp
以前广东顺德,后出差京城
北京工作了。。。。。。
不能急躁,一步一步走实
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(305)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'insert /*+ APPEND */',
blogAbstract:'摘自:http://yunjuanyunsu./blog/static//\r\n总结得出以下3点结论:a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。b、insert&/*+&append&*/&时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM&enqueue上使用模式3(row&exclusive),其允许其他DML在相同的模式上获得TM&enqueue。但是直接路径加载在TM&enqueue使用模式6(exclusive),这使其他DML在直接路径加载期间将被阻塞。',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:1,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'作挨踢的....\r\n主要是oracle erp\r\n以前广东顺德,后出差京城\r\n北京工作了。。。。。。\r\n不能急躁,一步一步走实',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 append和insert 的文章

 

随机推荐