2009-04-21 5 views
12

모든 사용자에게 2MB의 데이터베이스 공간이 할당되는 시나리오가 있습니다. 이제 할당 된 공간의 Percenatge 사용법을 보여줘야 테이블에있는 단일 레코드의 크기를 알아야합니다.단일 레코드의 크기는? SQL

나는 sp_spaceused를 사용하려고 시도했으며 심지어 datalength ..를 사용하는 사용자 정의 프로 시저를 작성했지만 그 결과에는 큰 차이가 있습니다.

이 문제를 해결할 방법이 있습니까?

+0

이 "공간"무엇을 사용합니까? –

+2

어떻게 사용자 데이터를 파티셔닝합니까? 그것은 모두 같은 테이블에 있습니까? 또는 각 사용자마다 자체 테이블이 있습니까? –

+0

모든 사용자 데이터가 저장되는 하나의 테이블이 있습니다. UserId는 개별 사용자 데이터를 차별화하는 데 사용됩니다. –

답변

0

데이터는 데이터베이스의 이름이 지정된 디렉토리의 디스크에 저장됩니다. 여기에는 측정하지 않는 것을 포함하여 모든 것이 포함됩니다 (지표 등). 그것을 측정하십시오.

+0

그 어떤 힌트를 측정하는 것이 유용 할 것입니다 –

10

상당히 복잡한 수식을 사용하여 행 (행 수)의 크기를 계산할 수 있습니다. 자세한 내용은 Books Online (ms-help : //MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/81fd5ec9-ce0f-4c2c-8ba0-6c483cea6c75.htm)을 참조하십시오. 요컨대

:

는 열의 수를 가지고 고정 길이 데이터 유형에 대한 데이터 유형에 의해 각각의 칼럼의 크기를 결정한다.

그런 다음 rowspace 계산 어떤 널 (NULL) 컬럼에 사용되는 공간을 계산한다

Row_Size는 = Fixed_Data_Size + Variable_Data_Size + Null_Bitmap + 4

+1

우수 링크 온라인 링크, 감사합니다. – DenNukem

24

테이블 이름으로 실행 DBCC SHOWCONTIG

dbcc showcontig ('TableName') with tableresults 

다음 볼을 최대 최소 및 평균 레코드 크기에서

+6

당신이 언급 한 그 크기의 단위는 KB 또는 B – semirturgay

+0

입니다. https://msdn.microsoft.com/en-us/library/ms175008.aspx - 이것을보고 나는 Bytes – JsonStatham

+0

FYI에 따른 것으로보고 있습니다. 연결된 MSDN 페이지 : "이 기능은 Microsoft SQL Server의 이후 버전에서 제거 될 예정이며 새로운 개발 작업에는이 기능을 사용하지 말고 가능한 빨리이 기능을 사용하는 응용 프로그램을 수정하십시오. 대신 sys.dm_db_index_physical_stats를 사용하십시오." – DaveD

11

다음 쿼리는 데이터베이스의 객체에 할당 된 페이지 수를보고 데이터에서 사용중인 @SpaceAllotted의 백분율을 알려줍니다.

SQL Server가 범위 수준에서 모든 공간을 할당하므로 행 수준에서 사용량을 측정하지 않는 것이 좋습니다. 각 익스텐트는 8 개의 8KB 데이터 페이지로 구성됩니다. 따라서 데이터베이스에 하나의 행만 있고 해당 행에 4 바이트의 데이터가있는 경우 전체 범위를 4 바이트를 보유하도록 할당해야합니다 (또는 할당되지 않은 페이지가있는 기존 범위가 사용됩니다).).

DECLARE @SpaceAllotted  FLOAT 
-- 2MB converted to kilobytes... 
SET  @SpaceAllotted = 2048 

SELECT 
    -- Allocation is done on the extent-level. 
    -- Each extent contains eight 8KB data pages. 
    ((1/(@SpaceAllotted)) * CEILING(CAST(SUM([ips].[page_count]) AS FLOAT)/8) * 64) * 100 AS PercentageUsed 
FROM 
    [sys].[dm_db_index_physical_stats](DB_ID(), NULL, NULL, NULL, NULL) ips 
    -- This will allow us to retrieve the page count of all tables in the 
    -- current database, regardless of whether or not they have clustered 
    -- indexes and/or non-clustered indexes. 
INNER JOIN 
    [sys].[indexes] i 
    ON 
     [ips].[object_id] = [i].[object_id] 
    AND [ips].[index_id] = [i].[index_id] 
우리가 혼합 된 범위의 가능성을 가지고 않기 때문에

,없이 좋은 방법 (이 방법이 있지만, 그들은 꽤 않을거야) 페이지가 어떤 범위에 할당 된 어떤 결정이 ISN 100 % 정확합니다. 또한 익스텐트에는 예약되어 있으므로 여전히 디스크 공간을 차지하는 사용 가능한 페이지가있을 수 있으므로 일반적으로이 예상치는 항상 낮아질 것입니다. 그러나 페이지 수준에서 데이터베이스를 검사하기 위해 무언가를 쓰지 않고 얻을 수있는 최선의 방법 일 것입니다.

아, 예를 들어 다른 답변을 보면 다른 옵션입니다. 기본적으로 페이지의 현재 데이터 파일 크기를 모두보고 소비 한 공간의 비율을 결정합니다. 자, 여기서도 경고가 있습니다 ...

  • (자동 증가가 활성화되고 제한되는) 데이터베이스에 지정된 최대 크기가 없다면 MAX_SIZE-1로 반환되기 때문에,이 비행하지 않습니다.
  • 실제 데이터가 사용하는 공간의 양을 정확하게 결정할 수 없습니다. 여기서 우리는 실제로 파일 시스템에서 얼마나 많은 공간이 사용되는지 살펴 보았습니다.
  • 로그 파일 공간이 없습니다. 예, 여전히 디스크 공간을 소비합니다.

희망 사항 중 하나가 문제를 해결합니다. SHOWCONTIG이 중단 될 것입니다 때문에

SELECT 
    ((1/CAST(SUM([df].[max_size]) AS FLOAT)) * CAST(SUM([df].[size]) AS FLOAT)) * 100 AS PercentUsed 
FROM 
    [sys].dm_io_virtual_file_stats(DB_ID(), NULL) vfs 
INNER JOIN 
    [sys].[database_files] df 
    ON 
     [vfs].[file_id] = [df].[file_id] 
WHERE 
    [df].[type] = 0 
+0

소원 나는 당신을 한 번 이상 투표 할 수 있었다. :-) –

11

, 당신은 또한 사용할 수 있습니다

SELECT * FROM sys.dm_db_index_physical_stats 
(DB_ID(N'DatabaseName'), OBJECT_ID(N'TableName'), NULL, NULL , 'DETAILED') 
관련 문제