不要被网络或他人误导啊,学技术还是身体力行的好

网上到处都是什么nologging放在insert 语句里减少redo size的说法,但是很少看到有数据来说明,或者测试的环境有所差别,其他的不说了,nologging那个eygle网站上有,append神马情况下减少redo,nologging用在神马情况下也不说了,就来说说那个insert append nologging语句以及测试了append到底是减少redo还是undo?。

create table t nologging as select ..........  这个有效,因为这个是建立一个nologging table ,为t

归档模式下测试,非归档模式,append hint可以减少redo的

--case 1:测试结果 ctas中对源表nolgging有效果,减少redo
dingjun123@ORADB> select * from redo_size;

     VALUE
----------
      1552

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> create table t  as select * from all_objects;

表已创建。

已用时间:  00: 00: 05.90
dingjun123@ORADB> select * from redo_size;

     VALUE
----------
  8759612

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> drop table t;

表已删除。

已用时间:  00: 00: 00.18
dingjun123@ORADB> create table t nologging as select * from all_objects;

表已创建。

已用时间:  00: 00: 08.30


dingjun123@ORADB> select * from redo_size;

     VALUE
----------
   8884200

已选择 1 行。

已用时间:  00: 00: 00.00


--case2:insert append hint +nologging???????无效果,不知道这语法从哪蹦出来的,到处引用
--下面的报错,但是把那别名换成nologging,放在源表位置和目标表位置竟然正确,这语法哪来的?在文档上没有找到,文档上的nologging不是这么在insert 里用的


dingjun123@ORADB> drop table t;

表已删除。

已用时间:  00: 00: 00.26
dingjun123@ORADB> insert into t m as select * from dual;
insert into t m as select * from dual
                *
第 1 行出现错误:
ORA-00926: 缺失 VALUES 关键字


已用时间:  00: 00: 00.01

dingjun123@ORADB> insert into t  as select * from dual x;
insert into t  as select * from dual x
               *
第 1 行出现错误:
ORA-00926: 缺失 VALUES 关键字


已用时间:  00: 00: 00.01


--开始测试,未见redo减少,但是那个nologging不报错,这是网上典型的说insert+append+nologging可以减少redo的说法

dingjun123@ORADB> create table t as select * from all_objects where 1=0;

表已创建。

已用时间:  00: 00: 00.81
dingjun123@ORADB> select * from redo_size;

     VALUE
----------
   8946112


已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> insert /*+ append */ into t select * from all_objects nologging;

已创建73940行。

已用时间:  00: 00: 10.48
dingjun123@ORADB> select * from redo_size;

     VALUE
----------
  17661336

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> rollback;

回退已完成。

已用时间:  00: 00: 00.00
dingjun123@ORADB> select * from redo_size;

     VALUE
----------
  17661460

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> insert /*+ append */ into t nologging select * from all_objects;

已创建73940行。

已用时间:  00: 00: 09.40
dingjun123@ORADB> select * from redo_size;

     VALUE
----------
  26318524

已选择 1 行。

已用时间:  00: 00: 00.01


--见Apress pro oracle sql beyond the select,开头就引入了这种用法,要注意,这不对
Direct Path Inserts
Direct path inserts can be invoked by using the APPEND hint (parallel inserts do this by default, by the
way). In Oracle Database 11g Release 2, there is a new APPEND_VALUES hint that can be used for
inserts that specify a values clause as opposed to using a SELECT to provide the values for inserting.
Listing 13-1 shows a simple example of both forms.
Listing 13-1. Simple Insert APPEND and APPEND_VALUES
insert /*+ append */ into kso.big_emp select * from hr.employees nologging;
insert /*+ append_values */ into dual (dummy) values ('Y');

----------------------------------------------------append hint到底减少redo还是undo-------------------------------------------------


还有那个append hint,好多地方说是减少redo的,其实不是的,append hint是减少对应table操作的产生undo,不是redo,append hint在非归档模式下的确可以减少redo产生,但是不能说append hint就减少了redo,可以看eygle那个“nologging何时才能生效”,append hint要在归档模式下减少redo,必须目标表是nologging的才可以。


append hint到底是神马东西??direct path insert,这个不说了,和神马HWM有关系,然后就是各种utility,比如神马sqlldr等,都有direct选项,然后神马parallel里的dml也是用了神马append,append神马滴后面不结束事务都不让你select,神马滴加了X锁。。。。。。。。。统统滴不研究。


下面测试append hint不管在归档非归档模式下,肯定是减少undo的

--case1:在归档模式下,结论:append hint是可以减少undo的

dingjun123@ORADB> create table t as select * from all_objects where 1=0;

表已创建。

已用时间:  00: 00: 00.76
dingjun123@ORADB> select * from undo_size;

     VALUE
----------
    114716

已选择 1 行。

已用时间:  00: 00: 00.00
dingjun123@ORADB> insert  into t  select * from all_objects;

已创建73941行。

已用时间:  00: 00: 09.31
dingjun123@ORADB> select * from undo_size;

     VALUE
----------
    399048

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> rollback;

回退已完成。

已用时间:  00: 00: 00.04
dingjun123@ORADB> select * from undo_size;

     VALUE
----------
    399048

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> insert /*+ append */  into t  select * from all_objects;

已创建73941行。

已用时间:  00: 00: 12.21
dingjun123@ORADB> select * from undo_size;

     VALUE
----------
    404732

已选择 1 行。

已用时间:  00: 00: 00.00
dingjun123@ORADB> rollback;

回退已完成。

已用时间:  00: 00: 00.14


--case2:在非归档模式下,append同样可以减少undo

dingjun123@ORADB> select * from undo_size;

     VALUE
----------
       108

已选择 1 行。

已用时间:  00: 00: 00.15
dingjun123@ORADB> insert /*+ append */  into t  select * from all_objects;

已创建73941行。

已用时间:  00: 00: 10.99
dingjun123@ORADB> select * from undo_size;

     VALUE
----------
       320

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> rollback;

回退已完成。

已用时间:  00: 00: 00.01
dingjun123@ORADB> insert  into t  select * from all_objects;

已创建73941行。

已用时间:  00: 00: 12.15
dingjun123@ORADB> select * from undo_size;

     VALUE
----------
    270776

已选择 1 行。

已用时间:  00: 00: 00.01
dingjun123@ORADB> rollback;

回退已完成。

已用时间:  00: 00: 00.04


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7655508/viewspace-759189/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7655508/viewspace-759189/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值