인덱스 Rebuild, ReOrganize

W·2024년 1월 24일
0

MSSQL

목록 보기
2/33

Ref.
MSSQL 인덱스 리빌드

목적

조각화 현상 해결 - 조각화가 많이 진행되어있으면 그만큼 search해야하는 과정도 많아지기때문에 성능이 느려진다.

1.인덱스 리빌드(Rebuild)

인덱스를 완전히 새롭게 다시 생성합니다.
즉, 기존 인덱스를 삭제하고 새로운 인덱스를 만들어 데이터를 정렬합니다.
리빌드 과정은 리소스를 많이 사용하며, 데이터베이스의 성능에 영향을 줄 수 있습니다.
리빌드는 인덱스 조각화가 심한경우 사용하는것이 좋습니다.

2. 인덱스 리오그나이즈(Reorganize)

인덱스의 논리적 조각화를 줄이기 위해 인덱스 페이지를 재구성합니다.
기존 인덱스를 유지하면서 페이지를 정렬하고 공간을 재활용합니다.
리오그나이즈 과정은 리소스 사용이 상대적으로 적으며, 데이터베이스 성능에 큰 영향을 주지 않습니다.
인덱스 조각화가 비교적 적은 경우에 사용 하는것이 좋습니다.
( 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
profile
타협하는 순간 발전이 없어

0개의 댓글