我正在创建一个应用程序,以便在数据库中提供有限的空间作为gmail帐户。我想根据他们的数据存储空间向客户收费。我用Google搜索但未找到合适的解决方案。
我想计算数据库中不同表的特定ID的单行的物理大小(硬盘空间)。我正在使用sql server。
举一个例子来理解这一点:
我们都使用gmail,并且在服务器上的邮件存储空间的空间有限。当我们超出存储空间的限制时,我们必须从我们的帐户中删除一些数据以获得可用空间(也用于硬盘)。
根据我的想法,gmail可能有一些不同的功能,但我需要这个。
注意:此帖子可能会重复/重复。欢迎你坦率地问。
由于
答案 0 :(得分:0)
在存在可空列,可变长度数据类型,每页开销和压缩的情况下,很难计算确切的存储大小。我使用其中一种实用方法:
答案 1 :(得分:0)
很抱歉,这不是问题的直接答案,但您可以使用
sp_spaceused 表名,以查看表占用多少空间(以及使用了多少)。
EXEC sp_spaceused N'[dbo].[sysdiagrams]';
name rows reserved data index_size unused
------------ ----- --------- ------- ----------- --------
sysdiagrams 303 264 KB 200 KB 16 KB 48 KB
然后,您可以计算不同长度的代表性列,并将成本除以计算特定行的空间。
希望能有所帮助。
答案 2 :(得分:0)
之前我遇到过这个问题,我找到的最佳解决方案是查找表的总大小(包括索引)并将其除以它所拥有的行数。如果您的表表示一个实体没有与平均值(这是我的情况)的宽数据长度偏差,并且您还有足够的行和数据来表示真实案例,这非常有用。
查看表格使用的大小的查询:
SELECT
TableName = t.NAME,
SchemaName = s.Name,
[RowCount] = p.rows,
TotalSpaceMB = CONVERT(DECIMAL(18,2), SUM(a.total_pages) * 8 / 1024.0),
UsedSpaceMB = CONVERT(DECIMAL(18,2), SUM(a.used_pages) * 8 / 1024.0),
UnusedSpaceMB = CONVERT(DECIMAL(18,2), (SUM(a.total_pages) - SUM(a.used_pages)) * 8 / 1024.0)
FROM
sys.tables t
INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id
WHERE
t.NAME NOT LIKE 'dt%'
AND t.is_ms_shipped = 0
AND i.OBJECT_ID > 255
GROUP BY
t.Name,
s.Name,
p.Rows
ORDER BY
TotalSpaceMB DESC
然后,您可以将UsedSpaceMB
除以RowCount
以获得平均尺寸。