2017-05-24 7 views
1

테이블에서 가장 많은 공간을 차지하는 사용자 레코드를 찾으려고합니다. 이를 위해함수를 SqlServer에 사용하고 있습니다.DataLength 값의 합이 테이블 크기와 일치하지 않습니다.

SELECT 
    UserName, 
    SUM(
     ISNULL(DATALENGTH(columnA), 1) + 
     ISNULL(DATALENGTH(columnB), 1) + 
     .... 
     ISNULL(DATALENGTH(columnZ), 1) + 
     )/1000000 AS SizeInMegaBytes 
FROM MyTable 
GROUP BY UserName 
ORDER BY SizeInMegaBytes DESC 

결과 :

+----------+-----------------+ 
| UserName | SizeInMegaBytes | 
+----------+-----------------+ 
| User1 |  1700  | 
+----------+-----------------+ 
| User2 |  1504  | 
+----------+-----------------+ 
| .... |  ....  | 
+----------+-----------------+ 
| User75 |  20  | 
+----------+-----------------+ 

전체 크기 = 1만6천5백23메가바이트

유일한 문제는 결과가 테이블의 크기와 일치하지 않는 것입니다.

+---------+-------+-------------+-------------+------------+-------------+ 
| name | rows | reserved | data  | index_size | unused  | 
+---------+-------+-------------+-------------+------------+-------------+ 
| MyTable | 61477 | 59425416 KB | 42482152 KB | 62584 KB | 16880680 KB | 
+---------+-------+-------------+-------------+------------+-------------+ 

저장 프로 시저가 아직 42기가바이트 등 총 데이터 크기의 모든 열 쇼의 쿼리를 보여줍니다 나는 테이블의 크기

sp_spaceused [MyTable] 

결과를 얻기 위해 내장 된 저장 프로 시저를 사용 16 기가 바이트. 모든 열의 크기를 고려한 경우 추가 공간을 차지할 수 있습니까?

EDIT - 이전 질문과 달리 모든 그룹 레코드의 SUM을 취하고 있기 때문에 내 문제가 언급 한 복제본과 같지 않다고 생각합니다. DataLength 함수의 SUM과 sp_spaceused (29 GB)의 결과 사이에는 큰 불균형이있는 것 같습니다. 인덱스 나 헤더 정보만으로는 설명 할 수 없다고 생각합니다.

+3

[sp \ _spaceused와 DataLength SQL Server의 차이점] (https://stackoverflow.com/questions/768320/difference-between-sp-spaceused-and-datalength-sql-server) – MarkD

답변

0

우선; 당신의 수학은 용의자입니다; 1MB = (1KB * 1KB) = 1024B * 1024B

둘째로; 테이블과 레코드와 관련된 메타 데이터가있을 수 있습니다. 테이블 정의를 검사하면 여기서 통찰력을 얻을 수 있습니다.

+0

나는 무엇을 볼 수 있습니까? 당신은 수학에 대해 말하고 있지만, 만약 내가 '/ 1048576'으로 질의를 바꾸면 여전히 16GB에서 42GB 사이의 차이를 설명하지 못합니다. 여분의 26 GB는 어디서 오는가? – webworm

+0

올바르게 기억하고 있다면, 사용 된 공간은 여러 필드의 조합입니다. 설명서 [여기] (https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-spaceused-transact-sql)를 확인하십시오. –

+0

@Jacob - I 네가 옳다고 생각해. 그래서 SELECT 문에 모든 열을 포함했습니다. – webworm