テーブルのどのユーザーレコードが最大のスペースを占めているかを調べようとしています。この目的のために、SqlServerでDATALENGTH
関数を使用しています。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 |
+----------+-----------------+
合計サイズ= 16523メガバイト
唯一の問題は、結果がテーブルのサイズと一致していないということです。
+---------+-------+-------------+-------------+------------+-------------+
| 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)の結果との間には大きな相違があるようですが、インデックスやヘッダー情報だけでは説明できないと思います。
[sp \ _spaceusedとDataLength SQL Serverの違い](https://stackoverflow.com/questions/768320/difference-between-sp-spaceused-and-datalength-sql-server)の可能な複製 – MarkD