【发布时间】:2017-07-13 21:07:36
【问题描述】:
目前我的数据库大小为 24MB,只有 5MB 数据,我正在尝试计算发布后数据库的未来增长。对我来说最明显的方法是从表中取出一个记录大小并将其乘以虚数。搜索后,我找到了几个脚本,但我无法得到正确的结果。
根据这个脚本,我得到了一条大约 2.5KB 的记录的值,看起来很大。
SELECT
t.NAME AS TableName,
s.Name AS SchemaName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB,
CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB
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
t.Name
这个脚本显示了表中每条记录的大小,在我的例子中,它是 77 个字节,看起来更真实,同时完全让我感到困惑。
declare @table varchar(20)
declare @idcol varchar(10)
declare @sql varchar(1000)
set @table = 'Compliants'
set @idcol = 'Id'
set @sql = 'select ' + @idcol +' , (0'
select @sql = @sql + ' + isnull(datalength(' + name + '), 1)'
from syscolumns where id = object_id(@table)
set @sql = @sql + ') as rowsize from ' + @table + ' order by rowsize desc'
exec (@sql)
我需要这个计算来确定未来的加速,如果不估计发布后数据库大小将如何增加,这是不可能的。有什么技术可以做到这一点吗?
【问题讨论】:
-
你可以创建一个测试数据库,用你期望的记录数量填充它,看看这对大小意味着什么。记录数据并不是影响数据库大小的唯一因素。想想可能会增加数据库大小的索引和事务日志之类的东西。
-
您忘记了物化视图、索引等等。关键是,它会根据需要增长。你真的能准确地估计它的使用频率吗?每天要插入多少数据?这些天存储很便宜。不过有一件事是肯定的。它只能增长到托管数据文件的存储大小!
标签: sql-server database azure