2017-04-26 2 views
0

SQL의 데이터베이스 파일에서 사용할 수있는 공간을 확인하기 위해 약간 수정 된 버전의 쿼리를 사용하여 어딘가에 있습니다.SQL 서버 데이터베이스 파일에서 사용되지 않는 공간 확인

SELECT 
    GETDATE() AS [Timestamp], 
    [TYPE] = A.TYPE_DESC, 
    [FILE_Name] = A.name, 
    [FILESIZE_MB] = CONVERT(DECIMAL(10, 2), A.SIZE/128.0), 
    [USEDSPACE_MB] = CONVERT(DECIMAL(10, 2), A.SIZE/128.0 - ((SIZE/128.0) - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)), 
    [FREESPACE_MB] = CONVERT(DECIMAL(10, 2), A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0), 
    [FREESPACE_%] = CONVERT(DECIMAL(10, 2), ((A.SIZE/128.0 - CAST(FILEPROPERTY(A.NAME, 'SPACEUSED') AS INT)/128.0)/(A.SIZE/128.0)) * 100), 
    [FILEGROUP_NAME] = fg.name, 
    [File_Location] = A.PHYSICAL_NAME 
FROM 
    sys.database_files A 
LEFT JOIN 
    sys.filegroups fg ON A.data_space_id = fg.data_space_id 
WHERE 
    A.TYPE_DESC NOT LIKE 'LOG' 
ORDER BY 
    A.TYPE desc, A.NAME; 

데이터가 데이터베이스에서 삭제 될 때 데이터베이스 파일이 축소되지 않으므로이 쿼리는 내가 찾고있는 모든 정보를 제공하지 않습니다.

SpaceUsed 파일 속성 (삭제 된 레코드로 인해 사용 가능한 공간 대비)에 실제 데이터가 얼마나 많이 들어 있는지 알 수있는 방법이 있습니까? 아니면 DBCC SHRINKDATABASE 같은 것을하고 파일의 실제 크기를 변경하는 유일한 옵션입니까?

나는 sp_spaceused, sys.dm_db_index_physical_stats 및 다른 몇 가지 사항을 살펴 보았지만 해결 방법을 찾지 못했습니다.

업데이트 : 나는 그것이 내가 옳다고 확신하지는 않지만, 내가 필요한 것에 조금 더 가깝다고 생각하는 것을 발견했다. 사용 된 페이지 수/평균 페이지 공간에서 사용 된 공간을 계산하는 것은 내가 기대하는 바에 가까운 값처럼 보입니다.

SELECT 
    page_count, 
    avg_page_space_used_in_percent 
FROM 
    sys.dm_db_index_physical_stats(db_id('TestDB'), NULL, NULL, NULL, 'Detailed') 

답변

0

SSMS에서 데이터베이스를 마우스 오른쪽 단추로 클릭하고 보고서로 이동 한 다음 표준 보고서를 선택한 다음 디스크 사용을 선택합니다. 그것이 당신을 위해 작동하지 않는다면 다른 표준 보고서 중 하나가 될 것입니다. 표준 디스크 사용 보고서에 원형 차트 아래

enter image description here

, 당신은이 작업을 수행 할 수있는 몇 가지 방법은, 내 개인적인 있습니다

enter image description here

+0

감사합니다. 이것은 기본적으로 쿼리에서 얻는 것과 같은 유형의 물건이므로 찾고있는 것을하지 않습니다. 나는 내가 원하는 것이 가능한지 아닌지 실제로 확신하지 못합니다. – thephez

1

데이터 파일에 사용되는 디스크 공간을 볼 수 있습니다 좋아하는 것은 문서화되지 않은 DBCC 명령 인 ShowFileStats입니다. 데이터베이스의 데이터 파일 목록, 디스크의 전체 익스텐트 수 및 사용중인 실제 익스텐트 수를 출력합니다.

기억이 안 나는 사람들을 위해 범위는 8 페이지이고 페이지는 8 킬로바이트 크기입니다. 따라서이 두 출력에 대한 약간의 수학은 당신이 찾고있는 정보를 제공해야합니다. 다음은 간단한 샘플 스크립트입니다.

DBCC 명령은 현재 데이터베이스의 컨텍스트에서 실행됩니다. 이것을 수정할 수 있고 그것을 약간의 루프로 바꿀 수 있습니다.

IF OBJECT_ID('tempdb..#tempDataUsage') IS NOT NULL DROP TABLE #tempDataUsage 
CREATE TABLE #tempDataUsage 
(
    [Fileid] INT, 
    [FileGroup] INT, 
    [TotalExtents] BIGINT, 
    [UsedExtents] BIGINT, 
    [Name] sysname, 
    [FileName] varchar(256) 
) 
DECLARE @SQLStatement NVARCHAR(400) = 'USE msdb 
DBCC ShowFileStats' 
INSERT INTO #tempDataUsage 
EXEC (@SQLStatement) 

SELECT 
    (TotalExtents * 8 * 8) AS totalSpaceOndiskKB, 
    (UsedExtents * 8 * 8) AS SpaceActuallyUsedKB, 
    Name AS DbName, 
    FileName 
FROM 
    #tempDataUsage 
+0

이것은 기본적으로 사용했던 쿼리와 동일한 정보를 반환합니다. 유망 해 보이는 다른 방법으로 질문을 업데이트했습니다. – thephez

+0

@thephez 그래, DMV가 작동합니다. 미안하지만 나는 그 "실제 데이터"코멘트를 잡지 못했다. 실제 합계를 얻으려면 Database_Id를 사용하여 그룹을 수행해야 할 수 있습니다. dmv가 객체 당 결과를 반환하는 것처럼 보입니다. 그러나 데이터 파일 당 단지 찾고 있다면, 난 여전히 ShowFilestats 선호한다. :) – mokszs