-- #1
ALTER TABLE T1 ADD(COL1 CHAR(1) DEFAULT 'Y');
-- #2
ALTER TABLE T1 ADD(COL1 CHAR(1));
ALTER TABLE T1 MODIFY (COL1 DEFAULT 'Y');
#1은 컬럼을 추가하는 동시에 기존 레코드에도 디폴트값을 넣는다.
기존 테이블에 1000만개의 레코드가 담겨있다면 컬럼추가와 동시에 1000만개의 'Y' 업데이트 되는 작업이 일어난다.
#2는 컬럼을 우선 추가하고 modify 를 통해 향후에 인서트 될 컬럼의 속성을 변경하며, 기존 레코드는 변경되지 않는다.
따라서 1000만개의 레코드에는 아무런 값이 업데이트 되지 않고, 이후 새롭게 인서트 되는 레코드에 대해서만 Y가 들어간다.
트랜잭션이 빈번히 발생하는 테이블에 컬럼을 추가할 때 #1 의 방식으로 컬럼을 추가할 경우,
- 새로 추가된 컬럼에 디폴드 값을 설정하느라 테이블이 상당 시간동안 접근 불가능 상태가 될 수 있다.
- 이렇게 된다면 다른 세션에서 해당 테이블에 접근하는 트랜잭션은 컬럼 추가 작업이 끝날 때까지 모두 ( library cache lock) 대기 상태에 빠지거나 timeout으로 실패하게 될 것이다.
- 결국 서비스에 BLOCKING 이 발생된다.
하지만 어쩔수없이 모든 컬럼에 default 값을 넣어야 한다면
컬럼 추가 후 update 를 쳐서 트랜잭션을 분리하는 방법이 있겠다.
🎈 결론
컬럼을 추가할 때 디폴트 값을 함께 주는 것은 상황에 따라 주의해야 겠다.
참고: https://server-engineer.tistory.com/329 [HelloWorld]
반응형
'DB 관련' 카테고리의 다른 글
[Oracle] DB 힌트 사용법. hint (0) | 2021.08.11 |
---|---|
[Oracle] 그룹함수(rollup,cube,grouping sets, group) 차이점 (2) | 2021.05.26 |
[Oracle] UNION / UNION ALL 의 차이점과 주의점 고찰하기 (0) | 2021.05.26 |
[Oracle] DEFAULT 값이 설정된 컬럼에 null 이 insert 되면 뭐가 들어갈까? (0) | 2021.05.20 |
[Oracle] CHAR, VARCHAR 의 비교방식 차이 (0) | 2021.05.20 |
댓글