2017-05-24 11 views
1

テーブルのどのユーザーレコードが最大のスペースを占めているかを調べようとしています。この目的のために、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)の結果との間には大きな相違があるようですが、インデックスやヘッダー情報だけでは説明できないと思います。

+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

第2;テーブルとレコードに関連付けられたメタデータが存在する可能性があります。テーブル定義を調べることで、ここで洞察を得ることができます。

+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

関連する問題