小编TTT*_*TTT的帖子

从 varbinary(max) 清空数据后缩小数据库的最佳方法?

我们有一个数据库,在varbinary(max)类型的字段中存储了大量数据。在某些时候,我们可以清除大多数行的数据,但不是全部。我们的计划是使该字段可以为空,并在不再需要数据时将其清空。一旦我们这样做,我们希望减少数据库的大小。实现这一目标的最佳方法是什么?

如果没有使用当前设置回收空间的好方法,我的一个想法是将该数据字段移动到只有两列的单独表:主表的键和数据字段。然后我们可以简单地删除不再需要的行。(然后进行某种收缩。)但是,这比简单地使现有字段可空要困难得多。

注意:我实际上不太关心使数据库文件变小,但我确实关心新释放的空间变得可重用。

超过 90% 的数据库大小是这一字段。我已经在 3TB 了。

sql-server disk-space blob varbinary sql-server-2014

8
推荐指数
1
解决办法
1132
查看次数

后悔身份:有没有办法强制插入指定身份列?

为了防止XY 问题,这是我们要解决的实际问题:

问题:

不幸的是,我们有一堆查找表,它们是在主键上使用标识列创建的,这是一个int. 我们希望可以简单地删除身份,但是,我们有一些带有指向身份列的外键的大型表,我的理解是在这种情况下删除身份很困难。我们对身份感到遗憾的原因是因为这些表需要跨多个环境同步,而开发人员通过编写脚本将数据插入到这些表中,而我们在多个环境上运行这些脚本但不一定总是按照相同的顺序,所以我们问开发人员始终:

  1. 启用身份插入
  2. 插入具有硬编码整数 ID 的行
  3. 禁用身份插入

如果每个人都这样做,数据要么保持同步,要么脚本失败,我们可以立即采取纠正措施来解决冲突。当然,有时开发者忘记遵守规则,直接无标识地插入,不同环境下以不同顺序运行的不同脚本的自动增量导致它们不同步,从而出现问题。

一个想法:

我们可以强制开发人员始终指定标识列吗?我认为没有办法简单地禁用这些表上的身份。如果我们将身份重新播种到较低的数字会怎样?当种子值已经存在时,任何未指定所有列的插入都会失败,并且会继续失败,直到插入尝试的次数超过现有(连续)行的数量。但是,在一次正确的插入之后,就会重新为表设定种子,下一次不正确的插入将再次使用自动增量。因此,这个想法的推断是在每次插入后(也许使用触发器,这感觉很奇怪,但可能有效?),或者按计划,或者可能每次我们运行开发人员的脚本时,将表重新设置为一个较低的现有数字。

这是一个合理的想法,和/或有更好的解决方案吗?

旁注:我们确实有一些其他想法,我认为这些想法超出了这个问题的范围,例如:

  1. 门控签入将解析脚本以插入某些表而不指定标识列,如果我们检测到这一点,则会失败。
  2. 将所有这些数据存储在源中并在部署时更新整个表。(而不是使用运行一次插入脚本。)
  3. 不要运行在所有环境上更改这些表的数据脚本,而是使用复制或其他同步机制。

尽管从长远来看,这些其他想法可能会更好,但似乎最容易实现的目标只是重新播种这些表,因此不正确的插入将会失败。

sql-server identity sql-server-2017

6
推荐指数
2
解决办法
1420
查看次数