본문 바로가기

MS-SQL

MSSQL 인덱싱된 뷰로 성능 최적화하는 방법

반응형

MSSQL에서 복잡한 쿼리를 반복적으로 실행하거나, 대용량 데이터를 그룹핑하거나 집계할 때 성능 병목 현상이 자주 발생합니다. 이럴 때 **인덱싱된 뷰(Indexed View)**를 잘 활용하면 쿼리 속도를 대폭 향상시킬 수 있습니다.

이 글에서는 인덱싱된 뷰의 개념부터 조건, 사용법, 그리고 실무 적용 팁까지 안내해 드립니다.

 

인덱싱된 뷰란?

인덱싱된 뷰는 인덱스를 가진 뷰로, 일반 뷰와 달리 실제로 데이터를 저장합니다.

일반 뷰는 테이블의 데이터를 가상의 테이블 형태로 보여줄 뿐, 데이터를 저장하지 않습니다. 반면, 인덱싱된 뷰는 클러스터형 인덱스를 생성함으로써 데이터를 물리적으로 저장하고, 뷰를 통해 데이터 조회 시 더 빠른 응답 속도를 제공합니다.


 언제 사용하나요?

  • 복잡한 조인 + 집계 쿼리를 반복 실행하는 경우
  • OLAP 환경처럼 읽기 위주의 대용량 조회가 많은 경우
  • 통계, 요약, 집계 데이터를 빠르게 제공해야 하는 대시보드 환경

인덱싱된 뷰 생성 단계

1. WITH SCHEMABINDING 필수

뷰를 생성할 때는 반드시 WITH SCHEMABINDING 옵션을 사용해야 합니다.
이 옵션은 뷰가 참조하는 테이블의 구조가 변경되지 않도록 고정시킵니다.

2. 고유한 클러스터형 인덱스 생성

인덱싱된 뷰를 만들기 위해서는 최소한 고유(UNIQUE) 클러스터형 인덱스가 필요합니다.

 

예제: 매장별 매출 요약 뷰 생성

1. 기본 테이블 예시

CREATE TABLE Sales (
    sale_id INT PRIMARY KEY,
    store_id INT,
    sale_amount DECIMAL(10, 2),
    sale_date DATE
);

2. 인덱싱된 뷰 생성

-- 스키마 바인딩된 뷰 생성
CREATE VIEW dbo.vw_SalesSummary
WITH SCHEMABINDING
AS
SELECT
    store_id,
    COUNT_BIG(*) AS sale_count,
    SUM(sale_amount) AS total_sales
FROM dbo.Sales
GROUP BY store_id;
GO

-- 클러스터형 인덱스 생성 (뷰를 물리화)
CREATE UNIQUE CLUSTERED INDEX idx_SalesSummary
ON dbo.vw_SalesSummary(store_id);

이제 vw_SalesSummary는 물리적으로 저장되며, 조회 시 훨씬 빠르게 결과를 반환합니다.

 

인덱싱된 뷰의 제약 조건

인덱싱된 뷰는 매우 강력한 기능이지만, 다음과 같은 제한 사항이 있습니다:

제한 사항설명
WITH SCHEMABINDING 필수 뷰 정의에서 명시해야 함
COUNT_BIG()만 사용 가능 COUNT(*)는 사용할 수 없음
TOP, DISTINCT, ORDER BY 사용 불가 뷰 정의에서 제한됨
외부 함수, GETDATE(), 서브쿼리 등 금지 비결정성 함수 사용 불가
조인 가능하지만, 복잡도 제한 존재 2~3 테이블 조인이 일반적
 

성능 비교

-- 일반 쿼리
SELECT store_id, COUNT(*), SUM(sale_amount)
FROM Sales
GROUP BY store_id;

-- 인덱싱된 뷰 사용
SELECT * FROM vw_SalesSummary;

동일한 결과를 반환하지만, 두 번째 쿼리는 사전 계산된 값을 반환하므로 훨씬 빠릅니다.


실행계획 비교

SQL Server Management Studio(SSMS)에서 실행계획을 확인해 보면 일반 쿼리는 Clustered Index Scan이나 Hash Aggregate 연산이 포함되지만, 인덱싱된 뷰는 단순 Index Seek만 사용되므로 CPU/IO 부하가 현저히 줄어듭니다.


실무 팁

  • 인덱싱된 뷰는 쓰기 작업(INSERT/UPDATE/DELETE) 시 성능에 영향을 줄 수 있으므로, 읽기 위주의 시나리오에 적합합니다.
  • 뷰에 대한 인덱스는 자동으로 유지되며, 원본 테이블이 변경될 때 자동으로 업데이트됩니다.
  • 자주 사용되는 쿼리 패턴이라면 성능 측정을 통해 인덱싱된 뷰로의 전환을 고려해보세요.
  • 반드시 테스트 환경에서 먼저 성능 테스트를 진행한 후 운영 반영하세요.

결론

일반 뷰인덱싱된 뷰
가상의 테이블 물리적으로 저장된 결과
매번 계산 필요 계산 결과가 미리 저장됨
성능 이점 없음 성능 최적화 가능 (읽기 전용 시)
 

참고 자료

반응형