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

TpmC기반의 CPU 용량산정 방법으로
tpmC에 영향을 주는 동시 사용자 수, 트랙재션 수,기본 TPC 보정, 피크시,여유율 등 보정 계수 및 적용범위를 제시하고 있으며,
CPU용량 산정식은 아래와 같다.

CPU 용량(tpmC)=동시 사용자 수 *트랙잭션 수 * 기본 TPC보정치 * Peak Time 보정치 * CPU 부하 보정치
                      * 응용프로그램 복잡도 보정치 * 네트워크 보정치 * 클러스터 보정치 * 여유율 보정치

           
메모리 용량(MB)={OS 및 기본 영역 + 프로세스 수 * 응용 프로그램 장치}
                         * 버퍼 캐쉬 보정치 * 클러스터 보정치 * 여유율 보정치       
           
디스크 용량 산정 방법은 시스템 기본 영역, S/W 영역, DB영역, SWAP영역,
                        여유율 등 보정계수 및 적용범위를 제시하고 있으며, 아울러 다음과 같은 디스크 용량산정 식을 제시하고 있다.

내장디스크 용량(MB) = {시스템 OS영역 + 응용프로그램 영역 + 상용 소프트웨어 영역}
                                * SWAP영역 * 여유율 보정치        

외장디스크 용량 ={DB여역 + 백업영역} * RAID영역 * 여유율 보정치

원문 : http://blog.naver.com/rafun/20045360827

728x90

엔터프라이즈 솔루션에서 불가결한 데이터베이스. 정말 많이 사용하는 데이터 베이스를 어떻게 하면 좀더 효율적으로 사용할 수 있을까?


다른 많은 부분이 있지만 일단 DB에 대해 많이 알아야 잘 사용할 수 있을 것이다.


그러나 여기선 많이 안다고 생각하고 내 생각을 주저리 쓰겠다..


기준은 MS-SQL이다.


우리 많이 사용하는 DB 기능중에 하나는 커서이다. 우리가 ADO나 ADO.NET을 사용할 때 MS-SQL은 내부적으로 커서를 사용하게 된다.


가장 많이 사용하지만 대용량 데이터 처리시에는 정말 죽음이라고 생각할 정도로 퍼포먼스가 안나온다.


그래서 커서를 사용하지 않은 대용량 데이터를 사용할 수 있는 방법을 생각해보자..


커서를 사용하는 첫번째 이유는 반복적인 데이터 처리이다. 1000라인이던지 10000이던지 그 라인 하나 하나를 처리 하는것이 커서를 사용하는 목적이 되겠다.


그럼 커서를 어떻게 사용하는지 부터 알아보자.



위 소스는 아주 간단한 커서 사용문이다. 위와 같이 사용하면 된다. 커서에 대해서는 나중에 더 자세하게 풀어가 보도록 해야겠다.
커서는 재미있다.



DECLARE vend_cursor CURSOR
FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor


위 소스는 아주 간단한 커서 사용문이다. 위와 같이 사용하면 된다. 커서에 대해서는 나중에 더 자세하게 풀어가 보도록 해야겠다.


커서에 대해서 알아가면 갈 수록 재미있을 것이다.


그럼 위의 문을 어떻게 커서를 사용하지 않고 빠르게 진행할 수 있을까.. 힌트는 임시테이블이다. 임시테이블을 사용하는것도 그렇게 퍼포먼스에 도움이 되지는 않으나. 커서 보다는 빠른 속도를 얻을 수 있다.


그럼 만들어 보자.


DECLARE @tmpTable (

      code int intentity(1,1)

      , vendorid varchar(20)

)


위와 같이 임시 테이블을 생성했다 그리고 나면 바로 여기에 가공할 vendor 아이디 들을 넣어둔다.

INSERT @tmpTable
SELECT venordid
FROM Purchasing.Vendor

그럼 이제 임시 테이블  @tmpTable에는 사용할 vendor아이디 들만 들어가있다.. 이제 이걸 반복적으로 데이터를 뽑아내 업데이트를 하거나 거시기를 하면된다. 이건 예제 이므로... 좀 말이 안되는 쿼리도 나올 수 있다. 다 그냥 이렇게 사용하는거다라고 말하는것 뿐이니 그냥 참고하기 바란다 .

WHILE @totalCount >= @count
     BEGIN
         SELECT * FROM @tmpTable WHERE code=@count
         /* 여기서 알아서 작업을 하시길 */
         SET @count = @count + 1
     END

위와 같이 하면 되겠다. 이런 일반 커서를 사용하는것 보다 좀 더 좋은 퍼포먼스를 얻을 수 있다.

한가지 더 .. 일반적으로 레코드셋( Recordset )을 사용할 때는 반드시 커서타입이나. Lock Type을 지정해 주시기 바란다.

adOpenDynamic 은 adLockOptimistic 이라는 Lock조건을 줘야 업데이트, 인서트가 가능해 진다. 그리고 그냥 리스트 용으로 Recordset을 사용 할 경우는 adOpenForwardOnly, adLockReadOnly 쌍을 사용하기 바란다.

그리고 쿼리를 사용할 경우는 adCmdText , 테이블에 insert를 할 경우는 adCmdTableDirect라는 조건을 줘야 한다.

원문 : http://cafe.naver.com/askakiller/76

+ Recent posts