DataLength值的总和与表大小不匹配

时间:2017-05-24 16:05:46

标签: sql-server datalength

我试图找出表中哪些用户记录占用的空间最多。为此,我在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       |
+----------+-----------------+

总大小= 16,523 MB

唯一的问题是结果与表格的大小不匹配。我使用内置的存储过程来获取表的大小

sp_spaceused [MyTable]

结果:

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

存储过程显示总数据大小为42 GB,但所有列的查询显示为16 GB。如果考虑到所有列的大小,可能会占用多余的空间?

编辑 - 我认为我的问题与提到的副本相同,因为我在这里收集所有分组记录的SUM而前一个问题没有。 DataLength函数的SUM与sp_spaceused(29 GB)的结果之间似乎存在如此大的差异我不认为它可以仅由索引或头信息来解释。

1 个答案:

答案 0 :(得分:0)

首先;你的数学是可疑的; 1MB =(1KB * 1KB)= 1024B * 1024B

二;可能存在与表和记录相关联的元数据。检查表定义可以在这里提供见解。