我有一个具有490 M行和55 GB表空间的表,所以每行约167字节。该表包含三列:a VARCHAR(100)
,a DATETIME2(0)
和a SMALLINT
。该VARCHAR
字段中文本的平均长度约为21.5,因此原始数据应为每行32字节左右:22 + 2表示VARCHAR
,6表示DATETIME2
,2表示16位整数。
请注意,上面的空间仅是数据,而不是索引。我正在使用“属性” |“属性”下报告的值 储存| 一般| 数据空间。
当然必须有一些开销,但是每行135个字节似乎很多,尤其是对于大表而言。为什么会这样呢?其他人看到过类似的乘数吗?哪些因素会影响所需的额外空间量?
为了进行比较,我尝试创建一个包含两个INT
字段和1 M行的表。所需的数据空间为16.4 MB:每行17个字节,而原始数据为8个字节。另一个带有INT
和的测试表与VARCHAR(100)
实际表填充相同的文本,每行使用39个字节(44 K行),我希望其中有28个字节。
因此,生产表的开销要大得多。这是因为它更大吗?我希望索引大小大约为N * log(N),但我不明白为什么实际数据所需的空间是非线性的。
在此先感谢您提供任何指导!
编辑:
列出的所有字段均为NOT NULL
。实际表在该VARCHAR
字段和该DATETIME2
字段上按该顺序具有聚集的PK 。对于这两个测试,第一个INT
是(集群)PK。
如果很重要:该表记录了ping结果。这些字段是URL,Ping日期/时间和延迟(以毫秒为单位)。数据会不断添加,并且永远不会更新,但是会定期删除数据,以使每个URL每小时仅减少几条记录。
编辑:
这里的一个非常有趣的答案表明,对于具有大量读写的索引而言,重建可能没有好处。就我而言,所消耗的空间是一个问题,但是如果写性能更重要,则松散的索引可能会更好。