반응형
반응형

데이터베이스를 관리하다 보면 열을 변경해야 하는 경우가 발생합니다.

제 경험에 의하면, 열에 저장되는 값의 크기가 초기보다 커져서 현재의 데이터 타입으로는 원하는 값을 수용할 수 없어서 길이를 확장하는 경우가 가끔 발생합니다. 그 외에 동일한 데이터가 데이터베이스 내에 중복관리되고 있는데 테이블에 따라 데이터타입이 서로 상이하여 조인 시에 성능 저하가 발생하는 등의 문제가 발생하여 부랴부랴 데이터 타입을 동일하게 맞추는 경우도 아주 가끔이기는 하지만 발생합니다. 또는 NULL 허용으로 관리하였는데 NOT NULL로 변경하고자 하는 경우도 발생합니다.

열을 변경하는 구문은 단순하므로 작업에 어려움은 없을 겁니다.

열 데이터 타입 변경에 소요되는 시간을 사전에 제대로 예측하는 것이 필요합니다. 그를 위해서는 테스트 서버에서 사전에 테스트를 해 본 후에 작업 계획을 수립하고 실행할 것을 권고합니다.

그리고 ALTER COLUMN
대상이 되는 열에 인덱스가 존재한다면 우선 인덱스를 삭제한 ALTER COLUMN 실행해야 합니다.

 

[따라하기] nchar(3) 데이터 형식을 char(10) 데이터 형식으로 변경하기

USE Sample;

GO

SELECT * INTO ProductTest FROM AdventureWorks.Production.Product;

GO

EXEC sp_columns ProductTest;

GO

CREATE INDEX IDX_1 ON ProductTest (SizeUnitMeasureCode);

GO

/*

메시지 5074, 수준 16, 상태 1, 1

인덱스 'IDX_1'() 'SizeUnitMeasureCode' 종속되어 있습니다.

메시지 4922, 수준 16, 상태 9, 1

하나 이상의 개체가 열에 액세스하므로 ALTER TABLE ALTER COLUMN SizeUnitMeasureCode() 실패했습니다.

*/

DROP INDEX ProductTest.IDX_1;

GO

ALTER TABLE ProductTest ALTER COLUMN SizeUnitMeasureCode char(3);

GO

 

반응형
반응형

LargeTabAddNotNullCol 테이블에 DEFAULT 설정한 Addcol 열을 추가 다음에, 다시 열을 삭제하는 예제입니다. 제약 조건이 설정된 열은 제약 조건을 삭제한 , 열을 삭제합니다.

 

[따라하기] 삭제하기

USE Sample;

GO

ALTER TABLE CheckTest

ADD Addcol CHAR(100) NOT NULL CONSTRAINT DF_Addcol DEFAULT 'default value';

GO

ALTER TABLE CheckTest

DROP CONSTRAINT DF_Addcol;

GO

ALTER TABLE CheckTest

DROP COLUMN Addcol;

GO

 

반응형
반응형

테이블에 열을 추가할 경우, NOT NULL 속성으로 열을 추가할 수는 있지만 경우에는 반드시 DEFAULT 지정해야 합니다. 대용량 테이블에 대해서 NOT NULL 속성으로 열을 추가하면 소요시간이 오래 걸리고 잠금으로 인하여 서비스에 지장이 발생하는 문제가 발생합니다. 7X24 서비스를 제공해야 하는 시스템의 대용량 테이블에 NOT NULL 속성의 열을 추가하고자 하는 경우에는 먼저 NULL 속성(NULL 허용)으로 열을 추가하고, 추가한 열의 값이 NULL인 데이터를 조금씩 나누어서 UPDATE한 다음에 모든 NULL 값을 NULL이 아닌 값으로 업데이트되면 NOT NULL 속성으로 열을 변경하면 서비스에 지장 없이 작업이 가능합니다. 대용량 테이블인 경우에는, NOT NULL 속성으로 열을 추가하면 Sch-M Lock으로 심각한 블로킹을 유발할 수 있다는 점을 꼭 기억하세요. ^ ^

 

정해진 시간 내에 작업을 끝내야 하는 시스템에서 크기가 테이블에 열을 NOT NULL 추가하였는데, 정해진 시간 내에 ALTER TABLE 수행이 완료되지 않아서 서비스 장애로 이어지는 불상사가 간혹 빌셍합니다. 테스트 데이터베이스에서 소요시간을 미리 확인하고 소요시간이 제한된 시간을 초과한다면 다음의 팁을 활용하기 바랍니다.

대용량 LargeTabAddNotNullCol 테이블에, 데이터 형식이 char(50), NOT NULL 속성을 가진 NotNullCol 열을 추가하는 스크립트입니다.

[따라하기] NOT NULL 속성 추가하기

USE Sample;

GO

-- 테스트 테이블을 생성합니다.

SELECT identity(int,1,1) as Seq, p1.*

INTO LargeTabAddNotNullCol

FROM AdventureWorks.Production.Product p1

             CROSS JOIN AdventureWorks.Production.Product p2;

GO

-- NULL 속성으로 열을 추가합니다.

ALTER TABLE LargeTabAddNotNullCol

ADD NotNullCol char(50) NULL;

GO

-- 업데이터 성능을 위하여 인덱스를 생성합니다.

CREATE INDEX IDX_1 ON LargeTabAddNotNullCol (NotNullCol);

GO

-- 전체 데이터를 분할하여 업데이트합니다.

DECLARE @ROWS int

SET @ROWS=10000;

UPDATE TOP (@ROWS) LargeTabAddNotNullCol SET NotNullCol = 'default value'

WHERE NotNullCol IS NULL;

WHILE @@ROWCOUNT = 10000

BEGIN

    UPDATE TOP (@ROWS) LargeTabAddNotNullCol

             SET NotNullCol = 'default value'

    WHERE NotNullCol IS NULL;

END

GO

-- NotNullCol 열에 NULL 값이 있는지 확인합니다.

SELECT count(*) FROM LargeTabAddNotNullCol WHERE NotNullCol IS NULL

-- NotNullCol 열에 존재하는 인덱스를 제거합니다.

DROP INDEX LargeTabAddNotNullCol.IDX_1;

GO

-- NotNullCol 열을 NOT NULL 속성으로 변경합니다.

ALTER TABLE LargeTabAddNotNullCol

ALTER COLUMN NotNullCol char(50) NOT NULL;

GO

 

반응형

+ Recent posts

반응형