1

我正在尝试查找表中哪些用户记录占用的空间最多。为此,我使用了DATALENGTHSqlServer中的函数。

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 与 (29 GB) 的结果之间似乎存在如此大的差异,sp_spaceused我认为这不能仅由索引或标头信息来解释。

4

1 回答 1

0

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

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

于 2017-05-24T16:13:13.213 回答