Creative Commons License

Software Dev

프로그래밍기본
객체지향
프로젝트관리
알고리즘
데이타베이스

소프트웨어 개발에 필수적이고 필요한 주제에 대한 강의 및 공유

.

데이타베이스

Database 관련 기술을 다룹니다. 주로 MSSQL 기반이 될 것입니다. 비지니스 응용 개발자에게 DB 는 뗄 수 없는 존재죠...

기존 컬럼 사이에 새 컬럼 추가는 테이블 재 생성을 유발한다

작성자 : 박종명
최초 작성일 : 2009-11-17 (화요일)
최종 수정일 : 2009-11-17 (화요일)
조회 수 : 5544

제목 정하기 힘드네요.. ㅎㅎ

기존 테이블에 값이 많이 들어가 있는 상태에서, 새로운 컬럼을 추가해야 하는 상황이 발생했습니다

새로운 컬럼을 기존 컬럼들 사이에 비집고(?) 들어가도록 추가할려고 하니, 실행 시간이 엄청나게 길고 대부분
실패하게 되더군요. 그런데, 새로운 컬럼을 맨 마지막에 추가하니 아주 쉽게 성공했습니다

DBA 왈, 테이블 컬럼 중간에 새로운 컬럼을 추가할 경우, 테이블이 삭제되고 다시 생성되기 때문에
테이블에 값이 많을 경우, 엄청 오래 걸릴수 있다고 하는 힌트를 들었습니다

그래서, 프로필러와 함께 테스트를 해 보았습니다.

우선 테이블을 하나 만듭니다
CREATE TABLE TEST
(
   ID INT,
   NAME VARCHAR(50)
)

그리고 아래 쿼리를 이용하여 임의로 값을 한, 만개 정도 입력해 둡니다
DECLARE @I INT
SET @I = 0
WHILE(@I < 10000)
BEGIN
   INSERT INTO TEST(ID,NAME) VALUES(@I, @I)
   SET @I = @I + 1
END



이제 Age(나이) 라는 이름의 새로운 컬럼을 추가할 이슈가 생겼습니다
SQL Server Management Studio 에, 디자인 화면에서 새 컬럼을 추가 하는데,
기존 컬럼인 ID 와 NAME 사이에 들어가도록 합니다. 아래 그림처럼요...


그리고 저장을 하면, 시간이 꽤나 오래 걸리는 것을 알 수 있습니다

테스트에서는 만개의 데이터이지만, 실제 환경에서는 값이 엄청 나게 들어가 있을 수도 있어,
테이블 수정한다는게, 서비스를 중지하게 만드는 크리티컬한 원인이 되기도 합니다



그렇다면, 테이블 열 중간이 아닌, 열 마지막에 새로 추가하는 것은 어떨까요? 아래 그림처럼..

이렇게 하면 금방 저장되는 것을 알 수 있습니다


이제 이러한 결과가 나오는 원인을 알아 보기 위해, 프로필러의 도움을 좀 받아 봅시다

열 중간에 삽입하는 경우, 프로필러로 확인해 보면, 테이블이 제거되고 다시 생성되면서
기존 값들이 모두 다시 입력되는 것을 확인할 수 있습니다

아래 그림은 이 작업의 프로필러의 주요한 일부를 캡쳐한 것입니다

테이블 컬럼 중간에, 새로운 컬럼 추가는 다음과 같은 과정을 거치는 군요
1) TEST 테이블의 스키마와 동일한 형태의 Tmp_TEST 라는 임의의 테이블을 만든다 (create..)
2) TEST 테이블의 값들을 Tmp_TEST 로 모두 입력한다 (insert into..)
3) TEST 테이블을 제거 한다 (drop ..)
4) Tmp_TEST 테이블의 이름을 변경한다(sp_rename ..)


이제 시간이 오래 걸리는 이유를 아시겠죠?



그럼, 마지막에 컬럼을 추가하는 것은 어떨까요? 프로필러 보겠습니다

그냥 단순히 ALTER TABLE 구문이 실행되는 것을 확인할 수 있습니다



제가 말하고 싶은 결론은 이렇습니다

이미 테이블에 값이 많이 들어가 있는 상태이고 실제 운용중인 환경에서,
새로운 컬럼을 추가해야 한다면, 웬만하면 테이블 컬럼 마지막에 새로 추가하는 것이 좋습니다

물론 이 글의 예에서처럼, 만개 정도의 데이터는 그리 많지 않을 수 있습니다만,
실제 환경에서는 훨씬 많은 데이터가 저장되는 경우가 허다하죠

만일, 반드시 컬럼 중간에 추가해야 한다면, DB를 중지할 수 있는 정기점검과 같은 시간에 하는 것이
신상(?)에 좋을 것입니다 ^^;

이름
비밀번호
홈페이지
VV <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요