안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 7-9. 인덱싱된 뷰(Indexed View)를 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번에 진행할 강좌는 인덱싱된 뷰입니다.
TL;DR
뷰에 인덱스를 생성하는 예제로, 인덱싱된 뷰 작동 방식을 진행하고, 실행계획을 통해 성능을 확인하며, 끝으로 인덱스 공간 사용을 소개합니다.
인덱스(Index - 색인)는 간략히 데이터베이스에서 데이터를 빠르게 찾기 위한 장치입니다. SQL Server의 인덱스는 빠르게 데이터를 찾기 위해 B-Tree(Balanced Tree) 구조의 추가 저장소를 유지하며 지속적으로 인덱스 데이터를 업데이트합니다.
인덱싱된 뷰란
인덱싱된 뷰는 무엇일까요? 뷰는 테이블을 반영하는 거울인데, 이 거울에 인덱스를 생성하고 사용한다? 뷰에 인덱스를 생성하고 빠르게 쿼리 하는 방안에 대해서 논의합니다.
USE AdventureWorks; GO -- 뷰가 존재하면 삭제 IF OBJECT_ID(N'Sales.vSalesOrderGroup', N'V') IS NOT NULL DROP VIEW Sales.vSalesOrderGroup; GO -- 많은 데이터가 필요해 Sales.SalesOrderDetail 사용 SELECT SalesOrderID, COUNT_BIG(*) AS SaleOrderCount, Sum(LineTotal) AS SalesOrderTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID; GO -- 31,465건의 GROUP BY 결과에 대해 뷰 생성 CREATE VIEW Sales.vSalesOrderGroup WITH SCHEMABINDING AS SELECT SalesOrderID, COUNT_BIG(*) AS SaleOrderCount, Sum(LineTotal) AS SalesOrderTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID; GO -- 테스트 조회 SELECT * FROM Sales.vSalesOrderGroup; GO -- 뷰가 공간을 차지하는지 확인. 0KB 사이즈 EXEC sp_spaceused 'Sales.vSalesOrderGroup'; GO -- 뷰에 색인 생성 CREATE UNIQUE CLUSTERED INDEX IDX_vSalesOrderGroup ON Sales.vSalesOrderGroup (SalesOrderID); GO -- 실행계획을 확인하면 클러스터드 인덱스 검색(Seek) 수행 SELECT * FROM Sales.vSalesOrderGroup WHERE SalesOrderID = 43659; GO -- 인덱싱된 뷰가 공간을 차지하는지 확인. 저장소를 사용함. EXEC sp_spaceused 'Sales.vSalesOrderGroup'; GO
Sales.SalesOrderDetail 테이블에서 GROUP BY 된 결과셋을 이용해 뷰를 생성했습니다. - 전형적인 뷰입니다. 이 뷰에 테이블과 같은 방식으로 인덱스를 생성합니다. 인덱싱된 뷰를 생성할 때 집계 함수 사용 등 약간의 제약이 있지만(COUNT 사용 제한 등), 대부분 해결할 수 있습니다.
이어서 인덱싱된 뷰에 대해 쿼리하고 실행계획을 보면, 빠르게 데이터를 찾는 것을 확인할 수 있습니다.
이미지 - 인덱싱된 뷰 실행계획
재미있는 부분은, 뷰는 테이블을 반영하는 거울이라서 공간을 사용하지 않습니다. 하지만, 인덱싱된 뷰는 보시는 것처럼 공간을 사용합니다.
이렇게 인덱싱된 뷰에 대해서 살펴봤습니다. 다음은 뷰 마지막 강좌 - 실무에서 뷰 사용입니다.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.