반응형
반응형

데이터베이스를 생성할 때, 여러 개의 그룹을 만들어 이용하는 경우가 많습니다. 예를 들어, INDEXGROUP 이라는 파일 그룹을 만들어 인덱스는 모두 해당 파일 그룹에 생성한다든지, 덜 중요한 데이터는 다른 파일 그룹에 저장한다든지..

하지만, 다음과 같은 경우를 생각할 수 있습니다.

 

            

   

            CASE1) 인덱스(NonClustered Index)를 모두 다른 하나의 파일 그룹에 두기로 했는데,

                          실수로 그냥 PRIMARY에 뒀다.!

 

             CASE2) 목적에 따라 테이블을 파일 그룹별로 분리시키기로 했는데, 시간이 지나다 보니 제대로 안되었다.!

 

             CASE3) 파일 그룹에 어떤 개체들이 들어있는지 알아야 겠다.!

 

             CASE4) 데이터 공간이 부족해서 에러가 나부렸따.. 그런데, 파일도 많고, 파일 그룹도 많고..

                          파일 그룹별로 사용량을 보고 싶다~!

 

 

 

이러한 경우에 이용하기 위하여 다음과 같은 스크립트를 작성해 보았습니다..(물론, 도움말 및 기타 사이트 참고해서.^^)

혹시 위의 경우 외에도 참고하시기 바라며, 잘못된 부분이 있으시면 리플달아주세요~~

(예를 들어..sysindexes 테이블 보믄 되지~!! 같은 것.^^ -> 다 짜고보니, 그냥 그렇게 봐도 되겠네 생각 듭디다..ㅎㅎ)

 

 

 

 

 

 

 

CREATE DATABASE TESTDB

ON

(NAME=TESTDB_DATA1, FILENAME='C:\TESTDB_DATA1.MDF', SIZE = 10MB,

 FILEGROWTH=10MB, MAXSIZE = 30MB),

FILEGROUP [SECONDARY]

(NAME=TESTDB_DATA2, FILENAME='C:\TESTDB_DATA2.NDF', SIZE = 10MB,

 FILEGROWTH=10MB, MAXSIZE=50MB),

(NAME=TESTDB_DATA, FILENAME='C:\TESTDB_DATA3.NDF', SIZE = 10MB,

 FILEGROWTH=10MB)

LOG ON

(NAME=TESTDB_LOG, FILENAME='C:\TESTDB_LOG.LDF', SIZE = 50MB, FILEGROWTH=10MB)

GO

 

 

SP_HELPDB TESTDB

GO

/*

NAME                   FIELD          FILENAME                      FILEGROUP      SIZE           MAXSIZE

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

TESTDB_DATA1           1              C:\TESTDB_DATA1.MDF           PRIMARY 10240 KB       30720 KB

TESTDB_LOG             2              C:\TESTDB_LOG.LDF             NULL           51200 KB        Unlimited

TESTDB_DATA2           3              C:\TESTDB_DATA2.NDF           SECONDARY      10240 KB       51200 KB

TESTDB_DATA            4              C:\TESTDB_DATA3.NDF           SECONDARY      10240 KB        Unlimited

*/

 

 

USE TESTDB

GO

 

CREATE TABLE TABLEA

(

        SEQ INT IDENTITY,

        COL1 CHAR(1000) DEFAULT(REPLICATE('A', 999)),

        CONSTRAINT PK_TABLEA PRIMARY KEY(SEQ)

) ON [PRIMARY]

GO

 

CREATE INDEX IDX__1 ON TABLEA(SEQ) ON SECONDARY

GO

 

CREATE TABLE TABLEB

(

        SEQ INT IDENTITY,

        COL1 CHAR(1000) DEFAULT(REPLICATE('B', 999)),

        CONSTRAINT PK_TABLEB PRIMARY KEY(SEQ)

) ON SECONDARY

GO

 

 

SET NOCOUNT ON

GO

 

DECLARE @I AS INT

SET @I = 1

WHILE @I<=50000

BEGIN

        INSERT TABLEA DEFAULT VALUES

        INSERT TABLEB DEFAULT VALUES

        INSERT TABLEB DEFAULT VALUES

 

        SET @I = @I + 1

END

GO

/*

메시지1105, 수준17, 상태2, 5

'PRIMARY' 파일 그룹이 꽉차서'TESTDB' 데이터베이스의'TABLEA' 개체에 공간을 할당할 없습니다.

*/

 

SET NOCOUNT OFF

GO

 

 

 

 

--파일그룹별 개체정보

SELECT

               'FileGroup Name' = sfg.GroupName,

               'Object Name' = CASE si.IndID

                                             WHEN 1 THEN so.Name

                                              ELSE si.Name END,

               'Object Type' =        CASE

                                             WHEN si.IndID < 2 THEN 'Table'

                                             ELSE 'Index'END,

               'Table Name'=  CASE

                                             WHEN si.IndID > 1 THEN so.Name

                                             ELSE ' ' END,

               'System FileName' = sf.Name

FROM sysfilegroups sfg

        INNER JOIN sysfiles sf        ON sfg.groupid = sf.groupid

        INNER JOIN sysindexes si      ON sfg.groupid = si.groupid

        INNER JOIN sysobjects so      ON si.id = so.id

WHERE so.type = 'U'

        AND si.Name NOT LIKE '#_%' ESCAPE '#'

        AND so.Name NOT IN ('dtproperties')

ORDER BY 1, 3 DESC

GO

 

 

 

 

 

--파일 그룹별, 파일 , 사용한 크기, 현재 크기, 최대 크기 출력

SELECT

        a.FileGroupName,

        b.[FileCount],

        a.[UsedSize(MB)],

        b.[FileNowSize(MB)],

        CASE WHEN C.MinCheck = -1 THEN 'Unlimited' ELSE CAST(b.[MaxSize(MB)] AS VARCHAR(100)) END as [MaxSize(MB)]

FROM (

               SELECT --파일 그룹별 크기(실제 사용 크기)

                       'FileGroupName' = sfg.GroupName,

                       sfg.GroupId,

                       SUM(si.used * 8.0/1024) AS [UsedSize(MB)]

               FROM sysfilegroups sfg

                       INNER JOIN sysindexes si ON sfg.groupid = si.groupid

                       INNER JOIN sysobjects so ON si.id = so.id

               WHERE so.type = 'U'

                       AND si.Name not like '#_%' ESCAPE '#'

                       AND so.Name not in ('dtproperties')

               GROUP BY sfg.GroupName, sfg.GroupId

        ) a

        INNER JOIN

        (

               SELECT --파일 그룹별 크기(잡혀있는 크기)

                       GroupId,

                       SUM(size*8/1024.0) AS [FileNowSize(MB)],

                       SUM(maxsize*8/1024.0) AS [MaxSize(MB)],

                       COUNT(*) AS [FileCount]

               FROM sysfiles

               WHERE GroupId>0

               GROUP BY GroupId

        ) b ON a.GroupId = b.GroupId

        LEFT JOIN

        (

               SELECT ?파일 그룹 MaxSize = Limited 경우확인

                       GroupId, MIN(maxsize) as MinCheck

               FROM sysfiles

               WHERE GroupId>0

               GROUP BY GroupId

        ) c ON A.GroupId = c.GroupId

GO

 

 

 
반응형
반응형

현재 데이터베이스와 연관된 파일의 물리적 이름과 특징을 반환합니다. 파일 이름을 지정하지 않으면, 데이터베이스내의 모든 파일에 대한 정보를 확인할 있습니다.

 

[구문] sp_helpfile [ [ @filename = ] 'name' ] 

 

데이터베이스 파일 정보 확인하기

USE Sample;

GO

EXEC sp_helpfile;

GO

SELECT * FROM Sample.sys.database_files;

GO

 

크기가 큰 인덱스를 삭제하거나 다시 작성할 때 또는 큰 테이블을 삭제하거나 잘라낼 때 SQL Server 2005 데이터베이스 엔진은 트랜잭션이 커밋될 때까지 실제 페이지 할당 취소와 관련 잠금을 지연시킵니다. 이러한 구현은 다중 사용자 환경에서 자동 커밋 트랜잭션과 명시적 트랜잭션을 모두 지원하며 익스텐트를 129개 넘게 사용하는 큰 테이블이나 인덱스에 적용됩니다. 데이터베이스 엔진은 프로세스를 논리적 단계와 물리적 단계의 두 단계로 나눠 큰 개체를 삭제하는 데 필요한 할당 잠금을 피합니다.

 

- 논리적 단계 : 테이블이나 인덱스에 사용되는 기존 할당 단위가 할당 취소로 표시되고 트랜잭션이 커밋될 때까지 잠깁니다. 클러스터형 인덱스가 삭제되면 데이터 행이 복사되어 다시 작성된 클러스터형 인덱스나 힙을 저장하기 위해 생성된 새 할당 단위로 이동됩니다. 또한 인덱스 다시 작성의 경우 데이터 행이 정렬됩니다. 롤백이 있으면 이 논리 단계만 롤백해야 합니다.


 

- 물리적 단계 : 트랜잭션 커밋 후 발생합니다. 할당 취소로 표시된 할당 단위가 일괄 작업을 통해 물리적으로 삭제됩니다. 이러한 삭제 작업은 백그라운드에서 발생하는 짧은 트랜잭션 내에서 처리되며 많은 잠금을 필요로 하지 않습니다. 물리적 단계는 트랜잭션 커밋 후 발생하므로 테이블이나 인덱스의 저장 공간이 여전히 사용될 수 없는 것으로 나타날 수 있습니다. 물리적 단계가 완료되기 전에 데이터베이스가 증가하는 데 이 공간이 필요하면 데이터베이스 엔진이 할당 취소로 표시된 할당 단위로부터 공간을 복구하려고 합니다. 이러한 할당 단위에서 현재 사용하고 있는 공간을 찾으려면 sys.allocation_units 카탈로그 뷰를 사용하면 됩니다.

 

지연된 삭제 작업은 할당된 공간을 바로 해제하지 않기 때문에 데이터베이스 엔진에 추가 오버헤드 비용을 초래합니다. 따라서 128개 이하의 익스텐트를 사용하는 테이블과 인덱스는 SQL Server 2000 과 동일한 방식으로 삭제되고 잘리고 다시 작성됩니다. 즉, 논리적 단계와 물리적 단계가 모두 트랜잭션 커밋 전에 발생합니다.

지연된 삭제 작업 방식은 할당된 공간을 즉시 해제하지 않기 때문에 대형 인덱스를 삭제하거나 잘라낸 직후 sys.database_files에서 반환하는 값은 실제 사용할 수 있는 디스크 공간과 다를 수 있습니다.

반응형

+ Recent posts

반응형