为什么可能一个表中的数据空间采取了4倍的大小原始数据?
-
16-10-2019 - |
题
我有一个表490M行和55GB表的空间,因此大约有167个字节每行。表三列:一个 VARCHAR(100)
, , DATETIME2(0)
, 和一个 SMALLINT
.平均长度的文本 VARCHAR
现场约为21.5,使原始数据应该是大约32位字节每排:22+2的 VARCHAR
,6 DATETIME2
, 和2 16位整数。
请注意,上面的空间数据,而不是指数。我使用价值下报告属性|储存|General|数据的空间。
当然必须有 一些 开销,但135字节每排似乎是一个很大的,尤其是对一个大表。为什么会这样?有任何人看到类似的乘数?什么因素可能影响的数量的额外空间的需要?
为了便于比较,我试图创造一个表与两个 INT
领域1M行。数据所需空间是16.4MB:17字节每行的,则为8字节的原始数据。另一个试验表 INT
和一个 VARCHAR(100)
填入相同的文本的真实表使用39字节每行(44K行),其中我将指望28再加上一点。
所以生产表中有相当多的开销。这是因为它的大?我希望索引的尺寸大约N*日志(N),但是我看不出为什么需要的空间对实际的数据是非线性的。
预先感谢任何的指针!
编辑:
所有的领域列出 NOT NULL
.真的桌上有一个群集PK上 VARCHAR
领域和 DATETIME2
领域,在这个顺序。对于这两个测试,第一 INT
是的(集)PK。
如果它事项:该表是一个记录的平结果。该领域是网址,平日期/时间,等待时间在毫秒。数据是所附的不断,从未更新,但是数据被删除的周期性削减下来的只是一些记录每小时每网址。
编辑:
一个非常有趣的答案 在这里, 表明,对于一个指数与多的阅读和写作,重建不可能是有益的。在我的情况下,空间是一个问题,但如果写的表现是更重要的是,一个可能更有松弛的指数。
解决方案
讨论之后在评论原来的问题,似乎在这种情况下失去了太空而引起的选择聚集关键,这已经导致大量的碎片。
总是值得检查的状态的碎片通过sys.dm_db_index_physical_stats在这些情况。
编辑:以下新的意见
平均页面的密度(前重建的聚集指数)是24%,这完全符合原始的问题。该网页只有1/4的全部,因此总的尺寸为4倍的原始数据的大小。
其他提示
磁盘上的结构有开销:
- 行头
- 空位+指针
- 变长列偏移
- 行版指(可选)
- ...
把2×4个字节int列,你有
- 4字节的行头
- 2字节的指针指向空位
- 8bytes2int列
- 3字节的空位
哇17字节!
你可以同样为你的第二次试验表其具有更多的开销就像你原来有一个:
- 2字节的数变长列
- 2字节每变长柱
为什么区别?除了(我不会链接到这些)
- 你有没有重建索引来整理他们?
- 删除不收回的空间
- 数据网页将分割,如果插入中间
- 更新可能导致向前指针(叶的间隙)
- 行溢出
- 除varchar列没有索引重建或阻CLEANTABLE
- 堆或表(堆没有聚集指数=记录散的所有过)
- RCSI隔离水平(额外的14个字节每排)
- 尾随位(设置ANSI_PADDING是在通过默认)在varchar。使用DATALENGTH到checl,不是莱恩
- 运行sp_spaceused与
@updateusage = 'true'
- ...
看看这个: SQL服务器:如何创建一个表格,填补一个8KB页?
从这样:
具有数据的类型改变的时间?有变长列被删除?有的索引已经整理的往往但未重建的?有很多的行被删除,或有很多的变长列的经更新的显着?一些很好的讨论 在这里,.