메뉴 닫기

MSSQL 인덱스 재구성 재구축으로 성능 향상하는 방법

💾 MSSQL 인덱스 재구성 재구축으로 성능 향상하는 방법

⚡ ALTER INDEX REBUILD REORGANIZE로 조각화 최소화하고 속도 높이기

데이터베이스가 커질수록 쿼리 속도가 점점 느려지는 경험을 한 적이 있을 것입니다.
이는 인덱스의 조각화가 원인일 수 있습니다.
조각화가 심해지면 데이터 읽기 효율이 떨어지고, 결국 전체 시스템 성능 저하로 이어지죠.
이를 해결하기 위해 ALTER INDEX REBUILDALTER INDEX REORGANIZE 명령을 적절히 사용하면 인덱스를 최적화하고 쿼리 응답 속도를 향상시킬 수 있습니다.
이 글에서는 그 원리와 적용 방법을 구체적으로 알아보겠습니다.

MSSQL에서 인덱스 최적화는 단순한 유지보수가 아니라 성능 관리의 핵심입니다.
재구성(REBUILD)은 인덱스를 완전히 새로 만드는 방식으로, 높은 조각화율에서 효과적입니다.
반면 재구축(REORGANIZE)은 조각화를 조금씩 줄여 부하를 최소화하며, 가동 중인 서비스에도 영향을 줄이지 않는 장점이 있습니다.
각 방법의 특징과 실행 시 주의할 점을 이해하면 데이터베이스 운영 효율을 극대화할 수 있습니다.



📊 인덱스 조각화란 무엇인가

MSSQL에서 인덱스 조각화(Index Fragmentation)는 데이터 페이지의 물리적 순서와 논리적 순서가 일치하지 않는 현상을 말합니다.
즉, 데이터가 디스크나 메모리 상에서 불연속적으로 저장되어 검색 시 추가적인 읽기 작업이 발생하게 되는 것이죠.
이는 시간이 지남에 따라 데이터의 삽입, 수정, 삭제가 반복되면서 점점 심화됩니다.

조각화가 심해지면 쿼리 실행 계획에서 비효율적인 경로가 선택되거나, 디스크 I/O가 증가하여 응답 시간이 길어집니다.
특히 대용량 테이블이나 트랜잭션이 많은 환경에서는 성능 저하가 눈에 띄게 나타날 수 있습니다.
이 때문에 인덱스 조각화를 주기적으로 점검하고 적절히 관리하는 것이 매우 중요합니다.

🔍 조각화 유형

MSSQL에서 인덱스 조각화는 크게 논리적 조각화(Logical Fragmentation)물리적 조각화(Extent Fragmentation)로 나뉩니다.
논리적 조각화는 인덱스 페이지 순서가 뒤섞이는 현상이고, 물리적 조각화는 디스크 상에서 데이터 블록이 흩어져 저장되는 현상을 의미합니다.

📏 조각화율 확인 방법

조각화율을 확인하려면 다음과 같이 sys.dm_db_index_physical_stats DMV를 활용할 수 있습니다.

CODE BLOCK
SELECT 
    dbschemas.[name] as '스키마명',
    dbtables.[name] as '테이블명',
    dbindexes.[name] as '인덱스명',
    indexstats.avg_fragmentation_in_percent as '조각화율'
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
    AND indexstats.index_id = dbindexes.index_id;

일반적으로 조각화율이 5% 미만이면 조치가 필요 없으며, 5~30% 사이라면 REORGANIZE, 30% 이상이라면 REBUILD를 권장합니다.

🛠️ ALTER INDEX REBUILD 특징과 활용

ALTER INDEX REBUILD 명령은 기존 인덱스를 완전히 삭제한 후 새로 생성하는 방식으로 동작합니다.
이 과정에서 데이터 페이지들이 물리적, 논리적으로 재배치되므로 조각화를 완벽하게 제거할 수 있습니다.
다만, 이 작업은 상당한 리소스를 소모하며 테이블이나 인덱스에 잠금이 걸리기 때문에 대규모 테이블에서는 신중히 계획해야 합니다.

⚡ 주요 장점

  • 조각화를 완전히 제거하여 인덱스를 최적 상태로 복구
  • 🚀페이지 밀도를 최적화해 검색 속도 향상
  • 🔄병렬 처리가 가능하여 멀티코어 환경에서 효율적

⚠️ 주의사항

⚠️ 주의: REBUILD 작업은 기본적으로 전체 인덱스를 잠그므로, 대량의 데이터를 다루는 경우 서비스 중단 시간이 발생할 수 있습니다. ONLINE = ON 옵션을 사용하면 온라인 상태에서 재구성이 가능하지만, 이는 Enterprise Edition 이상에서만 지원됩니다.

💻 실행 예시

CODE BLOCK
ALTER INDEX 인덱스명
ON 스키마명.테이블명
REBUILD WITH (ONLINE = ON);

위 예시는 온라인 상태에서 인덱스를 재구성하는 방법입니다.
만약 온라인 옵션을 생략하면 작업 도중 인덱스가 잠기게 됩니다.
따라서 운영 환경에서는 가능하면 온라인 옵션을 사용하는 것이 좋습니다.



⚙️ ALTER INDEX REORGANIZE 특징과 활용

ALTER INDEX REORGANIZE 명령은 인덱스 페이지를 물리적으로 재정렬하고, 페이지 내부의 빈 공간을 최적화하는 작업입니다.
이는 조각화율이 비교적 낮을 때 사용되며, 인덱스를 완전히 재생성하지 않으므로 부하와 잠금이 적습니다.
운영 중인 데이터베이스에서도 서비스 중단 없이 수행할 수 있다는 점이 가장 큰 장점입니다.

🔹 주요 장점

  • 💡온라인 환경에서 서비스 중단 없이 실행 가능
  • 📉리소스 사용량이 적어 대규모 테이블에도 부담이 적음
  • 🧩인덱스 내부 페이지를 재배치해 데이터 접근 효율 향상

⚠️ 주의사항

⚠️ 주의: REORGANIZE는 조각화율이 높은 경우(30% 이상)에는 효과가 미미할 수 있습니다. 이 경우에는 REBUILD 작업을 고려해야 합니다.

💻 실행 예시

CODE BLOCK
ALTER INDEX 인덱스명
ON 스키마명.테이블명
REORGANIZE;

위 명령은 해당 인덱스의 조각화를 줄이고 페이지 밀도를 최적화합니다.
특히 24시간 가동되는 서비스에서는 REORGANIZE 방식이 안정적인 선택이 될 수 있습니다.

📌 조각화율에 따른 선택 기준

인덱스 조각화를 줄이는 방법을 선택할 때는 조각화율이 핵심 판단 기준이 됩니다.
조각화율은 데이터 페이지의 불연속성을 수치로 표현한 값으로, 이 비율에 따라 REBUILD와 REORGANIZE 중 어떤 방법을 사용할지 결정할 수 있습니다.

📊 선택 기준 표

조각화율 범위 권장 작업
0% ~ 5% 작업 불필요
5% ~ 30% REORGANIZE 권장
30% 이상 REBUILD 권장

💡 운영 환경 적용 팁

💡 TIP: 운영 환경에서는 트래픽이 적은 시간대에 작업을 예약하는 것이 좋습니다. 또한, 대규모 테이블의 경우 REBUILD 시 ONLINE 옵션을 사용하여 서비스 중단을 최소화하는 것이 안전합니다.

이러한 기준을 적용하면 불필요한 리소스 낭비를 줄이고, 효율적으로 인덱스를 관리할 수 있습니다.
특히, 자동화 스크립트나 유지보수 계획과 함께 적용하면 장기적인 성능 유지에 큰 도움이 됩니다.



💡 인덱스 유지관리 자동화 팁

MSSQL의 인덱스 조각화 관리는 주기적으로 실행해야 효과를 볼 수 있습니다.
이를 위해 수동으로 매번 실행하는 대신, 자동화된 작업 스케줄을 설정하면 효율적이고 안정적인 성능 유지가 가능합니다.
자동화는 SQL Server Agent 작업, 유지관리 계획(Maintenance Plan), 또는 PowerShell 스크립트를 활용해 구현할 수 있습니다.

🛠️ SQL Server Agent 활용

SQL Server Agent를 사용하면 지정한 시간대에 자동으로 REBUILD 또는 REORGANIZE 명령을 실행하도록 설정할 수 있습니다.
아래 예시는 조각화율에 따라 자동으로 명령을 선택하는 스크립트 예시입니다.

CODE BLOCK
DECLARE @TableName NVARCHAR(255)
DECLARE @IndexName NVARCHAR(255)
DECLARE @Frag FLOAT

DECLARE index_cursor CURSOR FOR
SELECT 
    t.name, i.name, s.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'LIMITED') s
JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id
JOIN sys.tables t ON t.object_id = i.object_id
WHERE i.name IS NOT NULL

OPEN index_cursor
FETCH NEXT FROM index_cursor INTO @TableName, @IndexName, @Frag

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @Frag > 30
        EXEC('ALTER INDEX ' + @IndexName + ' ON ' + @TableName + ' REBUILD')
    ELSE IF @Frag > 5
        EXEC('ALTER INDEX ' + @IndexName + ' ON ' + @TableName + ' REORGANIZE')

    FETCH NEXT FROM index_cursor INTO @TableName, @IndexName, @Frag
END

CLOSE index_cursor
DEALLOCATE index_cursor

⚙️ 유지관리 계획(Maintenance Plan)

SQL Server Management Studio(SSMS)에서 제공하는 유지관리 계획 마법사를 이용하면 GUI 환경에서 손쉽게 인덱스 유지관리 작업을 예약할 수 있습니다.
특히 초보 관리자도 복잡한 스크립트 작성 없이 일정에 맞춰 자동으로 조각화를 관리할 수 있다는 장점이 있습니다.

📌 PowerShell 스크립트 활용

대규모 환경이나 여러 서버를 동시에 관리하는 경우 PowerShell 스크립트를 이용해 인덱스 최적화 작업을 중앙에서 제어할 수 있습니다.
이 방식은 서버별 환경에 맞게 유연한 설정이 가능하다는 장점이 있습니다.

자주 묻는 질문 (FAQ)

인덱스 조각화를 꼭 관리해야 하나요?
네, 조각화가 심하면 쿼리 성능 저하와 디스크 I/O 증가로 이어질 수 있으므로 주기적인 관리가 필요합니다.
REBUILD와 REORGANIZE의 가장 큰 차이는 무엇인가요?
REBUILD는 인덱스를 완전히 새로 생성해 조각화를 완벽히 제거하지만, 잠금과 리소스 소모가 큽니다. REORGANIZE는 온라인으로 부하를 최소화하며 조각화를 줄이는 방법입니다.
조각화율은 어떻게 확인하나요?
sys.dm_db_index_physical_stats DMV를 사용하면 각 인덱스의 조각화율을 쉽게 확인할 수 있습니다.
운영 환경에서 REBUILD를 안전하게 실행하려면?
트래픽이 적은 시간대에 ONLINE = ON 옵션을 사용해 실행하면 서비스 중단을 최소화할 수 있습니다.
REORGANIZE를 매일 실행해도 되나요?
가능합니다. 리소스 소모가 적어 매일 또는 자주 실행해도 큰 부담이 없습니다.
인덱스 최적화를 자동화할 수 있나요?
네, SQL Server Agent 작업, 유지관리 계획, PowerShell 스크립트 등을 활용하면 자동화할 수 있습니다.
REBUILD 작업이 너무 오래 걸립니다. 해결 방법이 있나요?
파티션을 나누어 순차적으로 재구성하거나, ONLINE 옵션과 함께 MAXDOP 값을 조정해 작업 속도를 최적화할 수 있습니다.
REBUILD와 REORGANIZE 외에 다른 방법이 있나요?
필터링된 인덱스 생성, 클러스터형 인덱스 재설계, 데이터 파일 압축 등도 성능 최적화에 도움이 될 수 있습니다.

🚀 ALTER INDEX로 MSSQL 성능을 지키는 최적 전략

MSSQL의 성능 저하 원인 중 하나인 인덱스 조각화는 방치할 경우 쿼리 속도 저하와 서버 부하 증가로 이어집니다.
이번 글에서 다룬 ALTER INDEX REBUILD와 REORGANIZE 명령은 각각의 장단점이 뚜렷하므로, 조각화율과 운영 환경을 고려해 선택하는 것이 중요합니다.
5~30% 조각화율에는 REORGANIZE를, 30% 이상에서는 REBUILD를 적용하는 기준을 지키면 효율적인 성능 유지를 할 수 있습니다.
또한, 자동화된 유지관리 계획을 세우면 인덱스 최적화를 장기적으로 안정적으로 실행할 수 있습니다.
트래픽이 적은 시간대에 ONLINE 옵션을 사용하는 것은 서비스 중단을 줄이는 핵심 전략이 될 수 있습니다.


🏷️ 관련 태그 : MSSQL성능최적화, 인덱스조각화, ALTERINDEX, REBUILD, REORGANIZE, SQLServer관리, 데이터베이스튜닝, SQL자동화, DBA팁, 인덱스관리