Ref.
MSSQL 인덱스 리빌드
조각화 현상 해결 - 조각화가 많이 진행되어있으면 그만큼 search해야하는 과정도 많아지기때문에 성능이 느려진다.
인덱스를 완전히 새롭게 다시 생성합니다.
즉, 기존 인덱스를 삭제하고 새로운 인덱스를 만들어 데이터를 정렬합니다.
리빌드 과정은 리소스를 많이 사용하며, 데이터베이스의 성능에 영향을 줄 수 있습니다.
리빌드는 인덱스 조각화가 심한경우 사용하는것이 좋습니다.

인덱스의 논리적 조각화를 줄이기 위해 인덱스 페이지를 재구성합니다.
기존 인덱스를 유지하면서 페이지를 정렬하고 공간을 재활용합니다.
리오그나이즈 과정은 리소스 사용이 상대적으로 적으며, 데이터베이스 성능에 큰 영향을 주지 않습니다.
인덱스 조각화가 비교적 적은 경우에 사용 하는것이 좋습니다.
( LIKE 새로고침 )

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[INDEX_REBUILD]
AS
DECLARE
@VAL_SQL NVARCHAR(MAX)
,@VAL_TABLE_NM VARCHAR(MAX)
,@VAL_SCHEMA_NM VARCHAR(MAX)
,@VAL_INDEX_NM VARCHAR(MAX)
,@VAL_INDEX_PERCENT DECIMAL(5,2)
BEGIN
DECLARE CUR CURSOR FOR
SELECT T04.name AS SCHEMA_NAME
,T03.name AS TABLE_NAME
,T02.name AS INDEX_NAME
,T01.avg_fragmentation_in_percent AS INDEX_FRAG_PERCENT
FROM SYS.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) T01
INNER JOIN SYS.indexes T02 ON T01.object_id = T02.object_id AND T01.index_id = T02.index_id
INNER JOIN SYS.tables T03 ON T03.object_id = T02.object_id
INNER JOIN SYS.schemas T04 ON T04.schema_id = T03.schema_id
WHERE 1=1
AND T02.index_id > 0 AND T02.is_disabled = 0 AND T02.is_hypothetical = 0
AND T02.type_desc <> 'XML';
OPEN CUR
FETCH NEXT FROM CUR INTO @VAL_SCHEMA_NM , @VAL_TABLE_NM, @VAL_INDEX_NM, @VAL_INDEX_PERCENT
WHILE @@FETCH_STATUS = 0 BEGIN
-- 조각화 수치가 30이상이면 리빌드 아니면 리오그나이즈 실행
IF @VAL_INDEX_PERCENT >= 30
BEGIN
SET @VAL_SQL = 'ALTER INDEX [' + @VAL_INDEX_NM + '] ON [' + @VAL_SCHEMA_NM + '].[' + @VAL_TABLE_NM + '] REBUILD;';
END
ELSE
BEGIN
SET @VAL_SQL = 'ALTER INDEX [' + @VAL_INDEX_NM + '] ON [' + @VAL_SCHEMA_NM + '].[' + @VAL_TABLE_NM + '] REORGANIZE;';
END
PRINT '실행 명령: ' + @VAL_SQL;
EXEC sp_executesql @VAL_SQL;
FETCH NEXT FROM CUR
INTO @VAL_SCHEMA_NM , @VAL_TABLE_NM, @VAL_INDEX_NM, @VAL_INDEX_PERCENT
END;
CLOSE CUR
DEALLOCATE CUR
END