728x90

DBCC DBREINDEX 란 무엇인가?


DBCC DBREINDEX

지정한 데이터베이스의 테이블에 대해 하나 이상의 인덱스를 다시 작성합니다.

DBCC DBREINDEX는 테이블의 특정 인덱스나 테이블에 정의된 모든 인덱스를 다시 작성합니다. DBCC DBREINDEX는 인덱스를 동적으로 다시 작성함으로써 PRIMARY KEY나 UNIQUE 제약 조건을 보장하는 인덱스를 다시 작성할 때 해당 제약 조건을 삭제했다가 다시 만들 필요가 없습니다.

DBCC DBREINDEX를 사용하면 하나의 명령문에서 테이블의 모든 인덱스를 다시 작성할 수 있습니다. 각 DROP INDEX와 CREATE INDEX 문이 원자성을 가지려면 트랜잭션을 사용해야 하는 반면, DBCC DBREINDEX는 하나의 명령문에서 작업이 수행되므로 자동으로 원자성을 갖습니다. 또한 DBCC DBREINDEX를 사용하면 각 DROP INDEX와 CREATE INDEX 문을 사용할 때보다 최적화를 더 많이 활용할 수 있습니다.

DBCC DBREINDEX는 시스템 테이블에 대해 사용할 수 없습니다.

구문

DBCC DBREINDEX
    (     [ 'database.owner.table_name'    
           
[ , index_name
                 [ , fillfactor ]
            ]
        ]
    )     [ WITH NO_INFOMSGS ]

인수

'database.owner.table_name'

지정한 인덱스를 다시 작성할 테이블의 이름입니다. 데이터베이스, 소유자, 테이블 이름은 식별자에 대한 규칙을 따라야 합니다. 자세한 내용은 식별자 사용을 참조하십시오. databaseowner 부분이 제공된 경우 전체 database.owner.table_name을 작은따옴표(')로 묶어야 합니다. table_name만 지정할 경우에는 작은따옴표를 사용할 필요가 없습니다.

index_name

다시 작성할 인덱스의 이름입니다. 인덱스 이름은 식별자에 대한 규칙을 따라야 합니다. index_name을 지정하지 않거나 ' '로 지정하면 테이블의 모든 인덱스가 다시 작성됩니다.

fillfactor

인덱스를 만들 때 각 인덱스 페이지에서 데이터 저장에 사용되는 공간의 비율입니다. 클러스터된 인덱스가 다시 작성되므로 fillfactor는 원래 채우기 비율을 다시 작성된 인덱스와 다른 클러스터되지 않은 인덱스의 새 기본값으로 대체합니다. fillfactor가 0이면 DBCC DBREINDEX는 인덱스가 만들어질 때 지정된 원래 fillfactor를 사용합니다.

WITH NO_INFOMSGS

심각도가 0에서 10 사이인 모든 정보 메시지를 표시하지 않습니다.





인덱스도 데이터입니다. 그래서 데이터가 추가되고 삭제되고 수정 됨에 따라서 인덱스 정보도 변경됩니다.
그러면 인덱스가 조각조각 찢어지는 현상이 발생하는데, 윈도우의 조각 모음과 비슷한 일을 하는게 DBREINDEX입니다.



다음은 pubs 데이터베이스의 authors 테이블에서 채우기 비율을 80으로 설정하여 au_nmind 클러스터되지 않은 인덱스를 다시 작성하는 예제입니다.

 

DBCC DBREINDEX ('pubs.dbo.authors', UPKCL_auidind, 80)

 


다음은 fillfactor 값을 70으로 사용하여 authors 테이블의 모든 인덱스를 다시 작성하는 예제입니다.


DBCC DBREINDEX (authors, '', 70)


한번에 한 서버의 모든 데이터베이스의 인덱스 재 작성하기

----------------------------------------------------------------------

/*
sp_name : usp_allReindex

sp_Explanation : 디비 서버의 모든 테이블에 대해 DBCC DBREINDEX를 실행합니다.

Input Parameters : None

Output Parameters : None

Usage : exec usp_allReindex
*/

ALTER PROCEDURE usp_allReindex
AS

-- 변수 선언
DECLARE @SQLString varchar(300), @dbname varchar(30), @tblname varchar(30)

SET NOCOUNT ON

-- 테이블 리스트 저장 테이블
CREATE TABLE #tables
(
    tblname varchar(30)
)

-- 한 서버의 디비 목록을 위한 커서 시작
DECLARE cur_dbList CURSOR
FOR
SELECT name FROM master..sysdatabases WHERE name NOT IN ('master','model','msdb','tempdb') ---- (1)

OPEN cur_dbList
FETCH cur_dbList INTO @dbname

WHILE @@fetch_status = 0
BEGIN
    TRUNCATE TABLE #tables
    SET @SQLString = 'insert into #tables select name from ' + @dbname + '..sysobjects where type = ''U'''
    EXEC (@SQLString)

    -- 각 디비의 테이블 목록을 위한 커서 시작
    DECLARE cur_tblList CURSOR
    FOR
    SELECT tblname FROM #tables

    OPEN cur_tblList
    FETCH cur_tblList INTO @tblname

    WHILE @@fetch_status = 0
    BEGIN
        SET @SQLString = 'DBCC DBREINDEX (''' + @dbname + '..' + @tblname + ''', '''', 90)' ---- (2)
        EXEC (@SQLString)
        FETCH cur_tblList INTO @tblname
    END

    CLOSE cur_tblList
    DEALLOCATE cur_tblList

    FETCH cur_dbList INTO @dbname
END

CLOSE cur_dbList
DEALLOCATE cur_dbList

DROP TABLE #tables

---------------------------------------------------------------------------------------



1) 에서 시스템 데이터베이스의 dbid 는 4번까지 고정적입니다.
사용자 데이터베이스는 dbid가 유동적입니다. 즉 삭제하고 다시 만들면 dbid를 재 사용합니다.
그래서 명확하게 시스템 데이터베이스의 이름을 지정해서 사용자 데이터베이스를 추출 하는게 좋을 것 같습니다.

(2) 에서 DBCC DBREINDEX의 사용법을 활용해서 원하는 방식으로 인자를 주시면 됩니다.

728x90

DBCC DBREINDEX 란 무엇인가?


DBCC DBREINDEX

지정한 데이터베이스의 테이블에 대해 하나 이상의 인덱스를 다시 작성합니다.

DBCC DBREINDEX는 테이블의 특정 인덱스나 테이블에 정의된 모든 인덱스를 다시 작성합니다. DBCC DBREINDEX는 인덱스를 동적으로 다시 작성함으로써 PRIMARY KEY나 UNIQUE 제약 조건을 보장하는 인덱스를 다시 작성할 때 해당 제약 조건을 삭제했다가 다시 만들 필요가 없습니다.

DBCC DBREINDEX를 사용하면 하나의 명령문에서 테이블의 모든 인덱스를 다시 작성할 수 있습니다. 각 DROP INDEX와 CREATE INDEX 문이 원자성을 가지려면 트랜잭션을 사용해야 하는 반면, DBCC DBREINDEX는 하나의 명령문에서 작업이 수행되므로 자동으로 원자성을 갖습니다. 또한 DBCC DBREINDEX를 사용하면 각 DROP INDEX와 CREATE INDEX 문을 사용할 때보다 최적화를 더 많이 활용할 수 있습니다.

DBCC DBREINDEX는 시스템 테이블에 대해 사용할 수 없습니다.

구문

DBCC DBREINDEX
    (     [ 'database.owner.table_name'    
           
[ , index_name
                 [ , fillfactor ]
            ]
        ]
    )     [ WITH NO_INFOMSGS ]

인수

'database.owner.table_name'

지정한 인덱스를 다시 작성할 테이블의 이름입니다. 데이터베이스, 소유자, 테이블 이름은 식별자에 대한 규칙을 따라야 합니다. 자세한 내용은 식별자 사용을 참조하십시오. databaseowner 부분이 제공된 경우 전체 database.owner.table_name을 작은따옴표(')로 묶어야 합니다. table_name만 지정할 경우에는 작은따옴표를 사용할 필요가 없습니다.

index_name

다시 작성할 인덱스의 이름입니다. 인덱스 이름은 식별자에 대한 규칙을 따라야 합니다. index_name을 지정하지 않거나 ' '로 지정하면 테이블의 모든 인덱스가 다시 작성됩니다.

fillfactor

인덱스를 만들 때 각 인덱스 페이지에서 데이터 저장에 사용되는 공간의 비율입니다. 클러스터된 인덱스가 다시 작성되므로 fillfactor는 원래 채우기 비율을 다시 작성된 인덱스와 다른 클러스터되지 않은 인덱스의 새 기본값으로 대체합니다. fillfactor가 0이면 DBCC DBREINDEX는 인덱스가 만들어질 때 지정된 원래 fillfactor를 사용합니다.

WITH NO_INFOMSGS

심각도가 0에서 10 사이인 모든 정보 메시지를 표시하지 않습니다.





인덱스도 데이터입니다. 그래서 데이터가 추가되고 삭제되고 수정 됨에 따라서 인덱스 정보도 변경됩니다.
그러면 인덱스가 조각조각 찢어지는 현상이 발생하는데, 윈도우의 조각 모음과 비슷한 일을 하는게 DBREINDEX입니다.



다음은 pubs 데이터베이스의 authors 테이블에서 채우기 비율을 80으로 설정하여 au_nmind 클러스터되지 않은 인덱스를 다시 작성하는 예제입니다.

 

DBCC DBREINDEX ('pubs.dbo.authors', UPKCL_auidind, 80)

 


다음은 fillfactor 값을 70으로 사용하여 authors 테이블의 모든 인덱스를 다시 작성하는 예제입니다.


DBCC DBREINDEX (authors, '', 70)


한번에 한 서버의 모든 데이터베이스의 인덱스 재 작성하기

----------------------------------------------------------------------

/*
sp_name : usp_allReindex

sp_Explanation : 디비 서버의 모든 테이블에 대해 DBCC DBREINDEX를 실행합니다.

Input Parameters : None

Output Parameters : None

Usage : exec usp_allReindex
*/

ALTER PROCEDURE usp_allReindex
AS

-- 변수 선언
DECLARE @SQLString varchar(300), @dbname varchar(30), @tblname varchar(30)

SET NOCOUNT ON

-- 테이블 리스트 저장 테이블
CREATE TABLE #tables
(
    tblname varchar(30)
)

-- 한 서버의 디비 목록을 위한 커서 시작
DECLARE cur_dbList CURSOR
FOR
SELECT name FROM master..sysdatabases WHERE name NOT IN ('master','model','msdb','tempdb') ---- (1)

OPEN cur_dbList
FETCH cur_dbList INTO @dbname

WHILE @@fetch_status = 0
BEGIN
    TRUNCATE TABLE #tables
    SET @SQLString = 'insert into #tables select name from ' + @dbname + '..sysobjects where type = ''U'''
    EXEC (@SQLString)

    -- 각 디비의 테이블 목록을 위한 커서 시작
    DECLARE cur_tblList CURSOR
    FOR
    SELECT tblname FROM #tables

    OPEN cur_tblList
    FETCH cur_tblList INTO @tblname

    WHILE @@fetch_status = 0
    BEGIN
        SET @SQLString = 'DBCC DBREINDEX (''' + @dbname + '..' + @tblname + ''', '''', 90)' ---- (2)
        EXEC (@SQLString)
        FETCH cur_tblList INTO @tblname
    END

    CLOSE cur_tblList
    DEALLOCATE cur_tblList

    FETCH cur_dbList INTO @dbname
END

CLOSE cur_dbList
DEALLOCATE cur_dbList

DROP TABLE #tables

---------------------------------------------------------------------------------------



1) 에서 시스템 데이터베이스의 dbid 는 4번까지 고정적입니다.
사용자 데이터베이스는 dbid가 유동적입니다. 즉 삭제하고 다시 만들면 dbid를 재 사용합니다.
그래서 명확하게 시스템 데이터베이스의 이름을 지정해서 사용자 데이터베이스를 추출 하는게 좋을 것 같습니다.

(2) 에서 DBCC DBREINDEX의 사용법을 활용해서 원하는 방식으로 인자를 주시면 됩니다.

728x90

DBCC PINTABLE

Microsoft® SQL Server™가 테이블의 페이지를 메모리에서 플러시하지 않고 고정될 테이블을 표시합니다.

구문

DBCC PINTABLE ( database_id , table_id )

인수

database_id

고정될 테이블의 데이터베이스 ID 번호입니다. 데이터베이스 ID를 확인하려면 DB_ID 함수를 사용합니다.

table_id

고정될 테이블의 개체 ID 번호입니다. 테이블 ID를 확인하려면 OBJECT_ID 함수를 사용합니다.

비고

DBCC PINTABLE은 필요할 때마다 테이블을 메모리로 읽어들이는 대신, 일반 Transact-SQL 문에 의해 테이블의 페이지가 버퍼 캐시에 저장되면 고정된 페이지로 표시합니다. SQL Server는 새 페이지를 읽어들일 공간이 필요하더라도 고정된 페이지를 플러시하지 않으며, 페이지의 업데이트 사항을 계속 기록하고 필요하면 업데이트된 페이지를 디스크에 다시 씁니다. 그러나 SQL Server는 DBCC UNPINTABLE 문으로 테이블이 고정 해제될 때까지 버퍼 캐시에서 사용 가능한 페이지의 복사본을 보관합니다.

DBCC PINTABLE은 자주 참조되는 작은 테이블을 메모리에 저장할 때 적합합니다. 이 방법을 사용하면 작은 테이블의 페이지를 메모리에 한 번 읽어들인 후 향후 데이터를 참조할 때는 디스크에서 읽어올 필요가 없습니다.

주의   DBCC PINTABLE은 성능을 향상시킬 수 있지만 주의해서 사용해야 합니다. 커다란 테이블을 고정할 경우 많은 용량의 버퍼 캐시를 사용하므로 다른 테이블에서 사용할 캐시가 부족하게 됩니다. 버퍼 캐시보다 용량이 큰 테이블을 고정하면 전체 버퍼 캐시를 채울 수도 있습니다. 이런 경우 sysadmin 고정 서버 역할의 구성원이 SQL Server를 종료했다 다시 시작한 다음, 테이블을 고정 해제해야 합니다. 너무 많은 테이블을 고정해도 이와 같은 문제가 발생할 수 있습니다.

결과 집합

결과 집합은 다음과 같습니다.

경고: 고정하는 테이블은 주의해서 다루어야 합니다. 고정된 테이블이 사용 가능한 데이터
캐시보다 크거나 커지면 서버를 다시 시작해야 테이블의 고정이 해제됩니다.
DBCC 실행이 완료되었습니다.
DBCC
에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
사용 권한

DBCC PINTABLE 권한은 sysadmin 고정 서버 역할의 구성원에게 기본적으로 부여되며, 양도할 수 없습니다.

예제

다음은 pubs 데이터베이스에서 authors 테이블을 고정하는 예제입니다.

DECLARE @db_id int, @tbl_id int USE pubs SET @db_id = DB_ID('pubs') 
SET @tbl_id = OBJECT_ID('pubs..authors') DBCC PINTABLE (@db_id, @tbl_id)

관련 항목

DBCC

메모리 아키텍처

DBCC UNPINTABLE

sp_tableoption

©1988-2000 Microsoft Corporation. All Rights Reserved.

+ Recent posts