使用sql server计算表中单行的物理大小

时间:2014-07-02 13:14:43

标签: sql-server database

我正在创建一个应用程序,以便在数据库中提供有限的空间作为gmail帐户。我想根据他们的数据存储空间向客户收费。我用Google搜索但未找到合适的解决方案。

我想计算数据库中不同表的特定ID的单行的物理大小(硬盘空间)。我正在使用sql server。

举一个例子来理解这一点:

我们都使用gmail,并且在服务器上的邮件存储空间的空间有限。当我们超出存储空间的限制时,我们必须从我们的帐户中删除一些数据以获得可用空间(也用于硬盘)。

根据我的想法,gmail可能有一些不同的功能,但我需要这个。

注意:此帖子可能会重复/重复。欢迎你坦率地问。

由于

3 个答案:

答案 0 :(得分:0)

在存在可空列,可变长度数据类型,每页开销和压缩的情况下,很难计算确切的存储大小。我使用其中一种实用方法:

  1. 使用简单的公式估算每行的存储大小。把事情简单化。每个整数4个字节。所有字符串列的1或2个字节的存储空间(取决于它们是varchar还是nvarchar)。然后,取总表大小(很容易找到),并根据估计的存储大小将其拆分。这样您就可以公平地分配所有开销和压缩成本。您可以确定该表的所有字节都已计入并支付。
  2. 按客户对表格进行分区,并让他们为他们使用的确切存储空间付费。请注意有关最大分区计数的限制。

答案 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以获得平均尺寸。