我正在尝试查找表中哪些用户记录占用的空间最多。为此,我使用了DATALENGTH
SqlServer中的函数。
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
我认为这不能仅由索引或标头信息来解释。