Freelist를 거치지 않고 HWM 바깥 영역에, 그것도 버퍼 캐시를 거치지 않고 데이터 파일에 곧바로 입력하는 방식이다.
/*+ append */
힌트 사용alter table t NOLOGGING;
update 주문 set 상태코드 = '9999'
where 주문일시 < to_date('20000101', 'yyyymmdd')
delete from 주문
where 주문일시 < to_date('20000101', 'yyyymmdd');
-- 대상테이블의 데이터로 temp 테이블 생성
create table 주문_임시 as
select * from 주문;
-- 대상테이블의 제약조건 및 인덱스 삭제
alter table emp drop constraint 주문_pk;
-- 대상테이블 truncate
truncate table 주문;
-- temp 테이블에 있는 원본 데이터를 update 할 값으로 수정하여 대상테이블에 insert
insert into 주문(고객번호, 주문일시,상태코드)
select 고객번호, 주문일시, ,
(case when 주문일시 >= to_date('20000101', 'yyyymmdd')
]then '9999' else status end) 상태코드
from 주문_임시;
-- 상테이블에 제약조건 및 인덱스 생성
alter table 주문 add constraint 주문_pk primary key(고객번호, 주문일시);
create index 주문_idx1 on 주문(주문일시, 상태코드);
create table 주문_임시
as select *
from 주문
where 주문일시 >= to_date('20000101', 'yyyymmdd');
alter table emp drop constraint 주문_pk;
drop index 주문_idx1;
truncate table 주문;
insert into 주문 select * from 주문_임시;
alter table 주문 add constraint 주문_pk primary key(고객번호, 주문일시);
create index 주문_idx1 on 주문(주문일시, 상태코드);
update 고객
set (최종거래일시, 최근거래금액) =
( select max(거래일시), sum(거래금액)
from 거래
where 고객번호 = 고객.고객번호
and 거래일시 >= trunc(add_months(sysdate,-1))
)
where exists (
select 'x'
from 거래
where 고객번호 = 고객.고객번호
and 거래일시 >= trunc(add_months(sysdate,-1))
);
update /*+ bypass_ujvc */
(select c.최종거래일시, c.최근거래금액, t.거래일시, t.거래금액
from (select 고객번호, max(거래일시) 거래일시, sum(거래금액) 거래금액
from 거래
where 거래일시 >= trunc(add_months(sysdate,-1))
group by 고객번호) t , 고객 c
where c.고객번호 = t.고객번호 )
set 최종거래일시 = 거래일시 , 최근거래금액 = 거래금액 ;
drop table t1;
create table t1(c1 number, c2 varchar2(1));
insert into t1
select rownum , 'x'
from dual
connect by level <= 10;
create unique index idx1_t1 on t1(c1);
-- t1 테이블의 자식 테이블인 t2 생성
drop table t2;
create table t2(c1 number, c2 number, c3 varchar2(1));
insert into t2
select mod(rownum,10) + 1 , rownum , 'x'
from dual
connect by level <= 100 ;
create unique index idx1_t2 on t2(c1, c2);
-- t1 컬럼 수정 => 키보존 테이블이 아니므로 수정 불가
SQL> update (select t1.c1, t1.c2, t2.c3
from t1 , t2
where t1.c1 = t2.c1 )
set c2 = 'A' ;
6행에 오류:
ORA-01779: 키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다.
-- t2 컬럼 수정 => 키보존 테이블이므로 수정 가능
SQL> update (select t1.c1, t1.c2, t2.c3
from t1 , t2
where t1.c1 = t2.c1 )
set c3 = 'A' ;
100 행이 갱신되었습니다.
-- t1 테이블 인덱스를 제거해서 M : N 관계로 만든 후 t2 컬럼 수정 => 수정 불가
SQL> drop index idx1_t1;
인덱스가 삭제되었습니다.
SQL> update (select t1.c1, t1.c2, t2.c3
from t1 , t2
where t1.c1 = t2.c1 )
set c3 = 'A' ;
6행에 오류:
ORA-01779: 키-보존된것이 아닌 테이블로 대응한 열을 수정할 수 없습니다
merge into 고객 c
using (select 고객번호 , max(거래일시) 거래일시 , sum(거래금액) 거래금액
from 거래
where 거래일시 >= trunc(add_months(sysdate, -1))
group by 고객번호) t
on (c.고객번호 = t.고객번호)
when matched then update set c.최종거래일시 = t.거래일시 , c.최근거래금액 = t.거래금액;