【问题标题】:SQL Server db data partition grows drastically when population a bit column填充位列时 SQL Server db 数据分区急剧增长
【发布时间】:2020-06-10 15:34:39
【问题描述】:

这是我第一次在这里发帖,希望我没有搞砸任何事情。

我使用了一个更改表来向现有数据库添加一个位类型列,以便了解该项目是否缺货。添加新列时,它会获得空值,因此我想将其更新为 0(有货),并且在大多数数据库中,都没有问题。问题是在较大的数据库中,我发现数据分区大小增长了很多(从 700 gb 到 800 gb)导致一些驱动器空间问题。

该表大约有 20 亿行,因此数据分区的增加是意料之中的,但从未想过 bit 类型的列会导致这样的增加,因为它假设每个列应该消耗 1 位(或至少从我的理解)。

我不是数据库专家,我需要确定为什么会发生这种情况,以便更好地理解并能够继续对其余数据库进行更改,以确保这不会失控。

【问题讨论】:

  • 您是否添加了具有默认值的列?什么版本/版本的 SQL Server?该表没有增长那么多,因为您添加了一个位列。该表正在增长,因为如果您添加了一列并且数据不再适合页面(例如页面已经满),SQL Server 必须分配一个新页面并将一半数据移到那里。如果您的所有页面都已满,那么您将分配很多新页面。在较新的版本(也许只有企业版?)上,可以添加它,这样它就不需要预先分配所有新空间,因此它更快/影响更小。
  • 一些背景herehere。如果您不能利用这一点,我建议您尝试将列添加为 NULL 并让您的代码将 NULL 视为 0 或添加约束并在添加列后批量更新数据。
  • 我将 0 设置为默认值,但在已经存在的数据上,该值设置为 null,这就是为什么我在此之后更新将值设置为 0。SQL Server 版本是 2012。我会阅读您分享的链接。谢谢!
  • 这真的与 programming 没有任何关系(this site all about),但是与数据库管理 - 所以这里是题外话,属于dba.stackexchange.com - 投票移动。
  • 对不起,我不知道。我该怎么做才能移动它??

标签: sql-server database size


【解决方案1】:

每个表的位被打包成字节,因此向表中添加一个位列(如果之前没有)将花费每行 1 个字节。

添加第二到第八位列是免费的。

添加第九个,多消耗 1 个字节的存储空间等。

【讨论】:

  • 考虑到这一点,大小应该在 300mb 左右,而不是 100gb。无论如何感谢分享,因为这是我不知道的事情,所以从现在开始考虑是有用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多