반응형
/**********************************************************************************************
-- Title : [2k] NOT NULL인 컬럼 추가시 블로킹 발생 줄이기

-- Reference : 웹검색
-- Key word : blocking column add
**********************************************************************************************/
USE Sample
GO

-- 테스트 테이블을 생성합니다.
SELECT IDENTITY(int, 1,1) AS SeqNo, o1.*
INTO LargeTabAddNotNullCol
FROM Northwind..Orders o1 CROSS JOIN Northwind..Orders o2
GO

-- 일단 NULL 허용 컬럼을 추가합니다.
ALTER TABLE LargeTabAddNotNullCol
ADD NotNullCol tinyint NULL DEFAULT (0)
GO

-- 업데이트 성능을 위하여 서비스 휴지 시간에 인덱스를 추가합니다.
CREATE INDEX IDX_NotNullCol ON LargeTabAddNotNullCol (NotNullCol)
GO

-- 전체 데이터를 한번에 업데이트하지 말고 분할하여 업데이트합니다.
SET ROWCOUNT 1000

DECLARE @UpdatedRows smallint

SET @UpdatedRows = 1000

WHILE @UpdatedRows = 1000
BEGIN
  UPDATE LargeTabAddNotNullCol SET NotNullCol = 0 WHERE NotNullCol IS NULL
 
  SET @UpdatedRows = @@ROWCOUNT
END

SET ROWCOUNT 0
GO

-- NULL인 데이터가 없는지 확인합니다.
SELECT count(*) FROM LargeTabAddNotNullCol WHERE NotNullCol IS NULL
GO

-- NOT NULL로 변경합니다.
ALTER TABLE LargeTabAddNotNullCol
ALTER COLUMN NotNullCol tinyint NOT NULL
GO

-- 인덱스가 필요하지 않다면 다음 서비스 휴지 시간에 인덱스를 삭제합니다.
DROP INDEX LargeTabAddNotNullCol.IDX_NotNullCol
GO
반응형

+ Recent posts