我在SQL Server中有一个具有以下架构的表“连接” :
[ID] [int] IDENTITY(1,1) NOT NULL,
[User] [nvarchar](20) NOT NULL,
[UserID] [int] NULL,
[True] [bit] NOT NULL,
[Comment] [nvarchar](max) NOT NULL,
[Created] [datetime] NOT NULL,
[Flag] [bit] NULL,
[Destination] [varchar](20) NULL
它在 ID 列上有一个主键聚集索引。
我需要每月获取此表上的条目生成的大小。我已经搜索了任何现有的 SP、函数或任何可以帮助我解决此问题的 DMV,但我只找到了如何获取表的大小而不是每行的大小。此外,我需要每月行的总大小,因此无法获得整个表上行的总大小/最小/最大值(如其他 stackexchange 帖子中提供的解决方案)。
我的尝试如下:
USE DB1;
SELECT DATEPART(year,created),
DATEPART(month,created),
(count (*))*(4+2*ISNULL((max(len([User]))),2)+4+1+2*ISNULL((max(len([Comment]))),2)+8+1+ISNULL(max(len([Destination])),2)) 'BytesPerMonth'
FROM Connections
GROUP BY DATEPART(year,created),DATEPART(month,created)
在上面我将行数乘以行的字节大小并考虑以下内容:
int - 4 bytes
nvarchar - 2 bytes per character ([nvarchar](max) also take 2 bytes per character, same as if we had [nvarchar](40), correct?)
bit - 1 byte
datetime - 8 bytes
varchar - 1 byte per character
但是,这仅提供了一个估计值,因为仅考虑了变量列的最大长度和(最大值)乘以行数,这导致比行的实际大小大得多的值。有没有办法在这种情况下获得每行的实际大小?
此外,我知道每行的行标题 - 每行另外 4 个字节(目前我没有包括这个,因为考虑到变量列的最大值,我的结果已经很大)。此外,我发现由于架构中的变量列,我应该考虑 3 个字节和 8 个字节,是否需要每行/每列考虑它们?如何计算索引的大小?
您可以使用DATALENGTH函数来获取一行中每一列的字节数。您可以将这些相加得到行的总数,得到 MIN、MAX、AVG 等等。
DATALENGTH 的优点是它为可变长度字段提供了实际使用的字节,因此无需猜测/估计。有关工作示例,请参阅此db<>fiddle 。