Post List

2015년 1월 9일 금요일

MS-SQL Indexed View 생성

Database 를 조회할 때 과도한 Join 으로 인하여 조회 성능이 많이 저하 될 수가 있다.

그럴 경우 되도록 Join 을 없에기 위하여 필요한 Data를 모두 Table에 넣으면 조회 속도는 빨라지는 대신 저장공간의 낭비가 심하다.

이것을 해결하기 가장 좋은 방법이 Indexed View 인듯 하다.

Indexed View는 일반적인 View에 UNIQUE CLUSTERED INDEX를  생성하는 것으로 구성되어 진다.

Clustered index가 만들어지기 때문에 저장 공간이 할당 된다.
그리고 원본 Table에 값에 변화가 생기는 경우 (Insert, Update, Delete) Index를 갱신해야 하므로,
변화를 주는 작업에 한해서는 기존보다 속도가 느려진다.

각각의 작업에 따른 비중에 따라서 신중하게 사용하여야 할 것이다.

만약 Table 갱신에 대한 속도가 조회 속도보다 더 중요하다면, Indexed View 뿐만 아니라 Index 사용을 안하는 편이 좋다.

Indexed View 를 만들기 위한 제한 사항들이 있다.

- 고유(unique) 클러스터형 인덱스를 생성해야 한다.
- 인덱스 된 뷰 생성시 SCHEMABINDING 옵션을 지정해야 한다.
- 모든 개체 명칭은 두 부분으로 된 명칭을 사용해야 한다. (예 dbo.테이블이름)
- SELECT 절의 모든 컬럼은 고유한 컬럼명을 부여해야 한다.
- 뷰 안의 쿼리에 집계를 하는 칼럼이 있는 경우 COUNT_BIG(*)을 포함해야 한다. (COUNT_BIG은 COUNT 함수와 같으며 결과값이 BIGINT로 반환된다. )

예제 )

CREATE VIEW VD_LotHistory WITH SCHEMABINDING
AS
    SELECT ManagementCode, L.LotNumber, L.ProcessCode, P.ProcessName, L.InspectCode,
                 I.InspectName, EndDate
      FROM dbo.TR_ManagementCodeHistory AS M INNER JOIN dbo.TM_LotHistory AS L ON



                                                                                         M.LotNumber = L.LotNumber
           INNER JOIN dbo.TC_Process AS P ON L.ProcessCode = P.ProcessCode
           INNER JOIN dbo.TC_InspectItem AS I ON L.InspectCode = I.InspectCode;
     
CREATE UNIQUE CLUSTERED INDEX IDX_V1 ON VD_LotHistory (ProcessCode, InspectCode, LotNumber);

댓글 없음:

댓글 쓰기