데이터엔지니어 군고구마
  • DBA 업무시 필요한 쿼리
    2015년 06월 04일 14시 20분 14초에 업로드 된 글입니다.
    작성자: DE 군고구마
    반응형

    DBA를 하면서 점검 시 필요한 스크립트를 정리해봤습니다.

    제가 정리한것과 퍼온글이 있으니 틀린 부분이 있을 수 있으니, 참고만 부탁드립니다.


    틀린 부분은 메일로 문의 주시면 수정 하겠습니다 ^^


    내용은 다음과 같습니다.

    1. 인덱스 조각화 확인 및 리빌딩

    2. 통계 확인 및 업데이트

    3. CHECKDB 관련 체크 및 복구 


    USE [데이터베이스명]

    GO

     

    /* 1. 인덱스

    인덱스의 조각화 정도를 확인하고, 조각화가 많이 일어났으면 해당 인덱스 또는 해당 DB의 모든 인덱스를

    리빌딩 해줘야 한다.

    */

    /* =====================================================================================================

    인덱스 조각화 확인

    ======================================================================================================*/

    DBCC SHOWCONTIG ('테이블 명')

     

     

    /* =====================================================================================================

    인덱스 조각화 확인( dm_db_index_physical_stats 를 이용한 확인)

    https://msdn.microsoft.com/ko-kr/library/ms188917.aspx

    ======================================================================================================*/

    SELECT database_id as '데이터베이스 ID',B.name AS '테이블 명',C.NAME AS '인덱스 명',

    A.index_type_desc AS '인덱스 타입',avg_fragmentation_in_percent AS '인덱스 논리 조각화 정도(%)',fragment_count AS '리프 수준 조각화 수'

    FROM sys.dm_db_index_physical_stats (DB_ID(), OBJECT_ID(''), NULL, NULL, NULL) AS A

    INNER JOIN SYS.tables AS B

    ON A.object_id = B.object_id

    INNER JOIN SYS.indexes AS C

    ON A.index_id = C.index_id AND A.Object_id = C.Object_id AND A.index_id = C.index_id

    ORDER BY avg_fragmentation_in_percent DESC

     

     

     

    /* =====================================================================================================

    인덱스 다시 리빌드(개별)

    https://msdn.microsoft.com/ko-kr/library/ms189858.aspx

    ======================================================================================================*/

    ALTER INDEX ALL ON [테이블명] REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90)

    GO

     

     

    /* =====================================================================================================

    모든 인덱스 다시 리빌드

    http://mdj1234.tistory.com/11

    ======================================================================================================*/

    DECLARE @i int, @sql varchar(1000)

    DECLARE @tablename varchar(1000),@ownerName  varchar(1000)

     

    SET @i = 1

     

    DECLARE DB_Cursor CURSOR FOR

    SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_SCHEMA, TABLE_NAME

     

    OPEN DB_Cursor

     

    FETCH NEXT FROM DB_Cursor

    INTO @ownerName, @tablename

    WHILE @@FETCH_STATUS = 0

    BEGIN

     

    SET @sql = 'ALTER INDEX ALL ON ' + @ownerName + '.' + @tablename + ' REBUILD WITH (PAD_INDEX = ON, FILLFACTOR = 90) '

    EXEC (@sql)

     

    PRINT CONVERT(VARCHAR, @i) + '__' + @ownerName + '.' + @tablename + '............ OK'

    SET @i = @i + 1

     

    FETCH NEXT FROM DB_Cursor

    INTO @ownerName, @tablename

     

    END

     

    CLOSE DB_Cursor

    DEALLOCATE DB_Cursor

     

     

    /* 통계정보 업데이트

    통계정보가 업데이트 되지 않으면 옵티마이저가 잘못된 통계 정보를 참조하여, 성능에 영향을 미칠수 있으므로, 통계를 주기적으로

    업데이트 해줘야 한다.

     

    * 통계 업데이트는 플랜 생성 시 영향이 있을 수 있으므로, 필히 점검떄 진행해야 한다.

    */

    /* =====================================================================================================

    통계 확인

    https://msdn.microsoft.com/ko-kr/library/ms174384.aspx

    ======================================================================================================*/

    DBCC SHOW_STATISTICS ([테이블명],[인덱스 명])

     

     

     

    /* =====================================================================================================

    데이터베이스의 모든 통계 업데이트

    ======================================================================================================*/

    SP_UPDATESTATS

     

     

     

    /* =====================================================================================================

    데이터베이스의 개별 통계 업데이트

    ======================================================================================================*/

    UPDATE STATISTICS [테이블 이름]

     

     

     

     

     

    /* 데이터베이스 무결성 체크

    데이터베이스가 문제가 없는지 주기적으로 체크하여, 문제가 CHECK DB를 통해서 복구할 수 있다.

    */

    /* =====================================================================================================

    데이터베이스 무결성 체크

    https://msdn.microsoft.com/ko-kr/library/ms176064.aspx

    ======================================================================================================*/

    DBCC CHECKDB('데이터베이스 명')

     

     

     

    /* =====================================================================================================

    데이터베이스 복구

    * 복구 옵션

                 - REPAIR_FAST : 인덱스 재생성 없이도 수정 가능한 오류 복구

                 - REPAIR_REBUILD : REPAIR_FAST의 작업 뿐만 아니라 인덱스 재생성 작업을 통해 복구

                 - REPAIR_ALLOW_DATA_LOSS : 오류를 복구하지만 데이터 손실 가능성이 있음

     

    옵션을 위부터 가장 작은 오류로 분류하며, 아래로 갈수록 크리티컬한 오류복구

    https://msdn.microsoft.com/ko-kr/library/ms176064.aspx

    ======================================================================================================*/

    -- 단일 사용자모드로 변경

    ALTER DATABASE [데이터베이스 명] SET SINGLE_USER WITH ROLLBACK IMMEDIATE

     

    -- 복구시도

    DBCC CHECKDB('데이터베이스 명',REPAIR_FAST)

     

    -- 멀티 사용자모드로 변경

    ALTER DATABASE [데이터베이스 명] SET MULTI_USER

     

     

    반응형

    'Database > MSSQL Server' 카테고리의 다른 글

    MSSQL Server 설정  (0) 2015.06.25
    MSSQL_테이블 복사,데이터 복사  (0) 2015.06.09
    MS SQL Server_952 Error  (0) 2015.04.09
    MSSQL_파일그룹 백업 및 복원  (0) 2015.04.09
    MSSQL_DMV 모음(1)  (0) 2015.04.09
    댓글