/*-----------------------------------------------------------
목표: 컬럼추가시NULL 성능테스트
전제조건
1. 테이블의40만건의데이터존재
2. CLUSTRED INDEX 존재
3. NON-CLUSSTERED INDEX 2개존재
----------------------------------------------------------- */
USE TEMPDB
GO
/*---------------------------------------------------------
조건1 ALTER TABLE 문을이용한컬럼추가
NOT NULL DEFAULT 값: ''
---------------------------------------------------------*/
-- 기존테이블존재하면삭제
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID('T1'))
DROP TABLE T1
GO
-- 테이블생성
CREATE TABLE T1(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
, 주소 CHAR(50) NULL
, 전화 CHAR(20) NOT NULL DEFAULT ''
)
-- 40만건의데이터추가
SET NOCOUNT ON
DECLARE @I INT
SET @I = 1
WHILE (@I <= 400000)
BEGIN
INSERT T1(주소, 전화) VALUES ('ABC', 'ABCD')
SET @I = @I + 1
END
SET NOCOUNT OFF
-- NON-CLUSTRED INDEX 생성
CREATE INDEX NC_ADDR ON T1(주소)
CREATE INDEX NC_ADDR_TEL ON T1(주소, 전화)
ALTER TABLE T1
ADD 주소 CHAR(50) NOT NULL DEFAULT ''
-- 12초
/*---------------------------------------------------------
조건2 새로운테이블생성후INSERT SELECT 문을이용하여
기존테이블의데이터추가
---------------------------------------------------------*/
-- 기존테이블존재하면삭제
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID('T2'))
DROP TABLE T2
GO
-- 테이블생성
CREATE TABLE T2(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
, 주소 CHAR(50) NULL
, 전화 CHAR(20) NOT NULL DEFAULT ''
)
-- 40만건의데이터추가
SET NOCOUNT ON
DECLARE @I INT
SET @I = 1
WHILE (@I <= 400000)
BEGIN
INSERT T2(주소, 전화) VALUES ('ABC', 'ABCD')
SET @I = @I + 1
END
SET NOCOUNT OFF
-- NON-CLUSTRED INDEX 생성
CREATE INDEX NC_ADDR ON T2(주소)
CREATE INDEX NC_ADDR_TEL ON T2(주소, 전화)
IF EXISTS(SELECT * FROM SYSOBJECTS WHERE ID = OBJECT_ID('T2_COPY'))
DROP TABLE T2_COPY
GO
--새로운테이블생성
CREATE TABLE T2_COPY(
ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY
, 주소 CHAR(50) NULL
, 전화 CHAR(20) NOT NULL DEFAULT ''
)
-- NON-CLUSTRED INDEX 생성
CREATE INDEX NC_ADDR ON T2_COPY(주소)
CREATE INDEX NC_ADDR_TEL ON T2_COPY(주소, 전화)
-- T2의내용을T2_CPOY 테이블에이동
INSERT T2_COPY(주소, 전화)
SELECT 주소, 전화 FROM T1
/*-----------------------------------------------
성능테스트결과
-- 조건1
DURATION CPU READS WRITES
1 2490 1188 72291 0
2 2681 1125 77293 0
3 2560 1156 77293 0
평균 2577 1156.3 75625.6 0
-- 조건2
DURATION CPU READS WRITES
1 39117 35469 4870443 5264
2 38014 35282 4887947 6216
3 38566 35359 4888387 3337
평균 38565.6 35370 4882259 4939
-------------------------------------------------*/
/*-----------------------------------------------
결론
새로운테이블을생성하여테이터를이동시키는방법
이성능부하가더높다.
-------------------------------------------------*/
-- 테이블삭제
DROP TABLE T1
DROP TABLE T2
DROP TABLE T2_COPY