SQL服务器中的表大小增长到120 GB

时间:2017-09-23 13:41:15

标签: sql-server database sql-server-2008

我正在使用SQL Server 2016,我的数据库中有表,表大小为120 GB。它有300列,所有列都是NVARCHAR(MAX),它有12,00,000条记录。大多数100列始终为NULL,或者它具有短值。这里我怀疑为什么12,00,000条记录采用120 GB,是因为数据类型?

这是一个Audit表。这将有CDC的历史信息。平均每个表每天会插入10,000条记录。因为在此,我的数据库大小正在增加,SQL查询速度很慢。这是一个Audit表,不用于任何查询。

请让我知道我的桌子很大的原因。

2 个答案:

答案 0 :(得分:2)

当然,这取决于你如何衡量桌子的大小以及其他操作的发生。

您正在观察每条记录大约10,000个字节。这似乎很大,但有些事情你需要考虑。

NVARCHAR(MAX)的最小尺寸为:

  

nvarchar [(n | max)]

     

可变长度的Unicode字符串数据。 n定义字符串长度和   可以是1到4,000之间的值。 max表示最大值   存储大小为2 ^ 31-1个字节(2 GB)。存储大小(以字节为单位)   输入数据的实际长度的两倍+ 2个字节。 ISO   nvarchar的同义词是national char vary和national character   变化

即使空字段占用2个字节加上可空标志。有300个字段,那就是600多字节(600 + 600/8)。

您可能还遇到仅部分填充的网页的问题。这取决于您如何插入数据,主键和系统参数。

还有其他考虑因素,具体取决于您测量尺寸的方式:

  • 最大的字段有多大?
  • 行占用多个页面的频率(每个附加页面都有额外的开销)?
  • 您使用的是宽字符,因此它们可能看起来比它们看起来要大。
  • 您的估算是否包括指数?
  • 如果您正在测量数据库大小,则可能包括日志表。

我建议您让DBA调查表格以查看是否存在任何明显问题,例如许多页面仅部分填充。

答案 1 :(得分:0)

编辑 :在澄清表格确实包含的行数时更新了答案。

考虑到120GB是120,000MB,每行100KB,平均每列约330个字节,通常相当高,但不包含300 nvarchar(max)列的表(注意ncharnvarchar类型每个字符取 2个字节,而不是1)。

此外,您评论其中一列的大小为2,000-90,000个字符(!),假设该列平均有46k个字符,我们得到的大小为:

1,200,000行x 46k字符x 2字节/字符= 105GB 仅适用于该列的数据

其余列留下15GB,或每行约13KB,每列44个字节,考虑到几乎所有列都是nvarchar(max)

但这些只是估算,用于获得任何列使用的实际大小:

select sum(datalength(ColumnName))/1024.00 as SizeKB from TableName

所有这些只考虑了数据,这是不准确的,因为数据库结构需要它的大小。例如,索引总和为表的总大小,大致它们采用索引中包含的列大小的总和(例如,如果要在大列上定义和索引,则需要另一个< / em> 100GB)。

您可以使用另一个问题中的以下脚本获取整个表使用的空间(它将显示数据库的每个表的大小):

Get size of all tables in database

检查列UsedSpaceMB,即数据和索引所需的大小,如果由于某种原因表使用了更多空间(通常是因为您删除了数据),那么{{1} (一些未使用的空间是正常的)。