본문 바로가기
㏈ª By β┖υΕJini/MS-SQL

컬럼 NULL 추가시 성능 비교

by ㏈ª ☞ β┖υΕJini.κR 2010. 11. 10.

사용자 삽입 이미지


/*-----------------------------------------------------------

목표: 컬럼추가시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