Columnstore Index 향상
DW(OLAP, BI, DA)성 테이블과 쿼리를 위한 Columnstore Index(이하 CSI) 기능도 버전에 따라 지속적으로 개선되고 있습니다. SQL Server 2025에서 여러가지 개선들이 있지만 그 중에서 가장 중요한 부분은 2022에서 Clustered CSI에서의 ORDER 절 지원에 이어 이제 Nonclustered CSI에서도 ORDER절을 지원한다는 것입니다. 그 외 ORDER 절과 함께 온라인으로 인덱스 빌드 지원 등 몇 가지를 소개하겠습니다.
1. Nonclustered CSI에서 ORDER 절 지원
CSI는 행 그룹을 세그먼트라는 단위로 분리해서 저장하고 접근하기 때문에 번호나 날짜와 같은 범위 검색에서는 해당하는 특정 세그먼트만 접근하는 것이 IO 효율과 쿼리 성능에 큰 영향을 미칩니다. 문제는 CSI를 생성할 때 특정 열 단위로 정렬된 상태로 저장되지 않는다는 점이고 따라서 물리적으로 세그먼트의 이득을 취할 수가 없었습니다.
이를 위해 SQL Server 2022에서 Clustered CSI 생성 시 ORDER 절을 지원했고 이제 Nonclustered Index에도 동일하게 ORDER절을 지원합니다, 추가로 정확히 정렬된 세그먼트를 구성하기 위해서는 MAXDOP = 1을 함께 지정해야 합니다, 아래 소스 코드를 참고하세요.
— 아래는 구문 형식의 예제로만 참고하세요
USE Northwind;
GO
SELECT * INTO OrdersTest
FROM dbo.Orders;
/*
1) OrderDate열 기준 세그먼트 정렬
*/
CREATE NONCLUSTERED COLUMNSTORE INDEX ncsi_ordertest_orderdate
ON dbo.OrdersTest
(
OrderDate, EmployeeID, CustomerID, ShipCountry
)
<strong>ORDER (OrderDate)</strong>
WITH (MAXDOP = 1);
2. ORDER 절 + ONLINE Index Build 지원
MAXDOP = 1과 함께 CSI를 구성하면 처리시간은 상대적으로 매우 느려집니다. 이제 ONLINE 옵션 지원으로 이 부분이 조금 더 부담스러워질 것으로 추정됩니다.
— CREATE
CREATE CLUSTERED COLUMNSTORE INDEX csi_ordertest_orderdate
ON dbo.OrdersTest
<strong>ORDER (OrderDate)</strong>
<strong>WITH (ONLINE = ON, MAXDOP = 1);</strong>
— ALTER
ALTER INDEX csi_ordertest_orderdate on dbo.OrdersTest
REBUILD WITH (ONLINE = ON, MAXDOP = 1);
3. LOB열 포함된 Clustered CSI에서 DBCC SHRINK* 정상 동작
제목이 모든 걸 설명합니다. varchar(max), varbinary(max)와 같은 LOB 열을 포함한 Clustered CSI에 DBCC SHRINKDATABASE 또는 SHRINKFILE에서 데이터 이동을 할 수 없어 제대로 축소할 수 없었다고 합니다. 2025에서는 이제 제대로 축소가 지원됩니다.
마치면서
위 내용 외에도 ORDER절을 사용한 Clustered CSI의 정렬 성능이 개선되는 등의 다른 기능들도 있으므로 실제로 CSI를 사용 중이거나 사용 계획이 있다면 상단의 링크 문서를 참고하시기 바랍니다.
고객들이 실무에서 많이 사용하지 않아서 너무나 아쉬운 대표적인 기능 중의 하나가 CSI입니다, 준비 중인 새 온라인 강의(인프런에 추가로 올릴 계획)에서 소개하겠습니다, CSI를 몰랐던 사용자들에게 좋은 기회가 되기를 희망해 봅니다.
감사합니다.


