请给我以下建议:
我正在计算具有以下数据类型(包括视图和用户架构表)的 LOB 对象的总大小。
select * from information_schema.columns where data_type in
('TEXT', 'NTEXT','IMAGE' ,'XML', 'VARBINARY')
or
(data_type = 'VARCHAR' and character_maximum_length = -1)
OR
(data_type = 'NVARCHAR' and character_maximum_length = -1)
一旦我得到以下查询的输出,我就使用 DATALENGTH 函数来获取每一列的大小。
SELECT SUM(DATALENGTH('ColumnName')) / 1048576.0 AS ColumnName FROM DatabaseName.schema.Tablename
注意: 输出将是兆字节,因为我正在使用/ 1048576.0
综上所述,我用于存储文件流数据的总驱动器大小为1 TB 。但是用 DATALENGTH 函数计算每个 LOB 列的长度后,它与 Drive 上当前使用的空间不匹配。
例如 :
当前驱动器大小为 1 TB,其中 951 GB 是可用空间 0.99 TB。这意味着 File Stream 数据类型列使用 50 GB。但是当我检查 T-SQL 上面的所有列时,我无法获得与已用空间 (50 GB) 匹配的确切大小。甚至不接近尺寸。它们的使用率非常低。
除了上述数据类型之外,还有什么可以使用该驱动器?
如何使用 DATALENGTH 函数计算列的大小,该函数将与文件流驱动器中的已用空间相匹配..
文件流卷上每个文件的空间以文件系统分配单元(块大小)为单位进行分配。当实际数据大小不是分配单元大小的精确倍数时,分配的空间将四舍五入为下一个分配单元大小的倍数。
下面的 PowerShell 命令将显示服务器上每个卷的分配单元大小:
使用上述命令返回的块大小值,您可以通过如下查询确定为每个文件流文件分配的实际空间:
对于小文件和大分配单元大小,未使用的分配空间量将很重要。例如,考虑一个 1K 的实际文件大小将需要 64K 的 AU 大小,每个文件浪费 63K 的存储空间。