我正在使用SQL Server 2016,我的数据库中有表,表大小为120 GB。它有300列,所有列都是NVARCHAR(MAX),它有12,00,000条记录。大多数100列始终为NULL,或者它具有短值。这里我怀疑为什么12,00,000条记录采用120 GB,是因为数据类型?
这是一个Audit表。这将有CDC的历史信息。平均每个表每天会插入10,000条记录。因为在此,我的数据库大小正在增加,SQL查询速度很慢。这是一个Audit表,不用于任何查询。
请让我知道我的桌子很大的原因。
答案 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)
列的表(注意nchar
和nvarchar
类型每个字符取 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} (一些未使用的空间是正常的)。