我正在将SQL Server与另一种数据库技术进行比较,并且为了比较磁盘需求,我想计算仅由SELECT查询返回的元素使用的磁盘数量,该SELECT查询通过简单的WHERE子句在几个表上进行联接,而不是整个表或数据库。这样一来,我不必麻烦将整个表或数据库中有价值的数据加载到另一个数据库中。
我有一个类似以下的查询:
.gitignore
除了如何查找整个表或数据库使用的磁盘空间外,我还没有在线找到任何建议。 SQL Server内置有什么可以帮助我的,还是我需要手工计算?
答案 0 :(得分:0)
可以通过收集行的大小来计算存储行的子集所需的存储空间的估计值。尽管对于具有多个联接的任意查询而言,以通用方式执行此操作是不可行的,但对于特定于该问题的查询,您可以构建一个查询,该查询将计算该查询中包含的所有行的大小,如下所示(基于https://www.c-sharpcorner.com/blogs/calculate-row-size-of-a-table-in-sqlserver1中的代码):
declare @sql nvarchar(max);
set @sql = '
SELECT COALESCE((
--table a
SELECT SUM(0'
select @sql = @sql + ' + isnull(datalength(' + name + '), 1)'
from sys.columns where object_id = object_id('a')
set @sql = @sql + ')
FROM a
WHERE a.id = 390330
), 0) + COALESCE((
-- table b
SELECT SUM(0'
select @sql = @sql + ' + isnull(datalength(' + name + '), 1)'
from sys.columns where object_id = object_id('b')
set @sql = @sql + ')
FROM b
WHERE b.id = 390330
), 0) + COALESCE((
-- table c
SELECT SUM(0'
select @sql = @sql + ' + isnull(datalength(' + name + '), 1)'
from sys.columns where object_id = object_id('c')
set @sql = @sql + ')
FROM c
WHERE c.id = 390330
), 0) + COALESCE((
-- table d
SELECT SUM(0'
select @sql = @sql + ' + isnull(datalength(' + name + '), 1)'
from sys.columns where object_id = object_id('d')
set @sql = @sql + ')
FROM d
WHERE d.id1 = 390330 OR d.id2 = 390330
), 0);
exec (@sql);