본문 바로가기
RDB/MSSQL

[MSSQL] 인덱스 조각화/리빌드

by kigo23 2023. 5. 2.
반응형

인덱스 조각화는 데이터베이스에서 인덱스 내부의 데이터 페이지가 물리적으로 분산되어 저장되는 현상을 의미합니다. 이는 데이터베이스의 성능에 부정적인 영향을 미칠 수 있습니다. 인덱스는 데이터베이스에서 검색 작업을 빠르게 수행하기 위해 사용되는 구조로, 데이터의 논리적인 정렬 순서를 유지하고 검색 속도를 향상시킵니다. 그러나 데이터가 추가, 수정 또는 삭제되면 인덱스의 조각화가 발생할 수 있습니다.

인덱스 조각화는 주로 두 가지 형태로 나뉩니다.

1. 내부 조각화 (Internal Fragmentation): 내부 조각화는 인덱스 페이지 내에서 빈 공간이 발생하는 경우를 말합니다. 예를 들어, 인덱스 페이지에 데이터를 추가하거나 삭제하면 해당 페이지의 공간이 남을 수 있습니다. 이렇게 발생한 빈 공간은 검색 작업 시 페이지를 읽는 데 걸리는 시간을 증가시킬 수 있습니다.

2. 외부 조각화 (External Fragmentation): 외부 조각화는 인덱스 페이지 간의 물리적인 공간이 분산되는 경우를 말합니다. 예를 들어, 인덱스 페이지들이 서로 떨어져 저장되는 경우 해당 인덱스의 검색 작업은 여러 디스크 I/O 작업을 필요로 하게 되어 성능 저하를 초래할 수 있습니다.

인덱스 조각화를 해결하기 위해서는 주기적인 인덱스 리빌드 작업이 필요합니다. 인덱스 리빌드는 인덱스를 재구성하여 조각화를 제거하고 최적의 성능을 유지하는 작업입니다.

 

다음 쿼리를 사용해 조각화된 인덱스를 분석할 수 있습니다.

SELECT
    OBJECT_NAME(a.object_id) AS [Table Name],
    b.name AS [Index Name],
    avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS a
JOIN sys.indexes AS b ON a.object_id = b.object_id AND a.index_id = b.index_id
WHERE avg_fragmentation_in_percent > 30;

 

다음 쿼리를 사용해서 인덱스를 리빌드 할 수 있습니다.

ALTER INDEX [인덱스명] ON [테이블명] REBUILD;

 

인덱스 리빌드는 데이터베이스 성능 최적화를 위해 중요한 작업이지만, 주의해야 할 몇 가지 사항이 있습니다. 먼저, 인덱스 리빌드 작업은 데이터베이스에 부하를 줄 수 있으므로, 시스템 부하가 적은 시간대에 실행하는 것이 좋습니다. 또한, 인덱스 리빌드 작업은 테이블 접근 권한이 필요하므로 관리자 권한으로 실행되어야 합니다.

또한, 인덱스 리빌드 작업은 모든 인덱스에 대해 수행할 필요는 없습니다. 주로 조각화 정도가 높은 인덱스에 대해 리빌드를 진행하면 됩니다. 조각화 정도를 확인하는 쿼리를 통해 어떤 인덱스가 리빌드가 필요한지를 파악하고, 해당 인덱스에 대해서만 리빌드 작업을 수행하면 됩니다.

마지막으로, 인덱스 리빌드 작업은 주기적으로 실행되어야 하지만 과도한 리빌드 작업은 오히려 성능을 저하시킬 수 있습니다. 따라서, 조각화 정도와 시스템 상태를 주기적으로 모니터링하고 필요한 경우에만 인덱스 리빌드를 수행하는 것이 좋습니다.

인덱스 리빌드는 데이터베이스의 성능 최적화에 중요한 요소입니다. 조각화된 인덱스는 검색 속도를 느리게 하고 성능 저하를 초래할 수 있으므로, 주기적인 리빌드 작업을 통해 인덱스를 최적의 상태로 유지하는 것이 필요합니다. 올바른 리빌드 전략과 작업 주기를 설정하여 데이터베이스의 성능을 향상시키고 사용자들에게 원활한 경험을 제공할 수 있습니다.