본문 바로가기
DB 관련

[Oracle] default 컬럼을 설정하는 두가지 방법과 주의점

by 주빵 2021. 5. 25.
-- #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]

 

 

반응형

댓글