更改大型SQL Server数据库中的列大小会导致问题

问题描述:

我有一个包含6亿多条记录和NVARCHAR(MAX)列的表。更改大型SQL Server数据库中的列大小会导致问题

我需要的列大小变更为固定大小,但我通常有两个选择与这个大DB:使用SSMS的设计师,这需要很长的时间,也许永远无法完成它

  • 变化它使用
  • 变化Alter Column,但随后的数据库不后工作,也许是因为我们有几个指标

我的问题是:什么是可能的解决方案,以实现无差错预期的效果?

注:我使用Azure上的SQL Server和这个数据库是在生产

谢谢

澄清:其实,我有我想要把

新的长度范围内的所有当前数据
+2

'但随后的数据库无法正常工作后that'请详细总是和张贴任何错误,文字 – TheGameiswar

+0

你想传递给固定长度的列NCHAR(m),或者你想要的只是将最大可能大小更改为固定值,但将列的长度保留为可变长度(我的意思是,从nvarchar(max)传递给nvarchar (M))? – sepupic

从未在Azure上做过这一点,但是在SQL Server上做了上亿行。

我将添加一个所需大小的新列,当然允许空值并创建所需的索引。 之后,我会更新大块这个新的列修剪/转换旧的列值为新的。毕竟,删除旧列上的索引并将其删除。使用SSMS的设计师,这需要很长的时间 也许永远也

+0

非常感谢!有没有办法从旧列快速复制到新列?我已经拥有所需长度的所有数据 – Techy

+0

'update table set newCol = oldCol其中indexChild在initChunkValue和endChunkValue之间'这将防止事务日志消化 – Horaciux

更改完成

什么SSMS会做幕后是

  • 创建一个新表您的列的新数据类型
  • 将原始表中的所有数据复制到新表
  • 重命名新与旧名称
  • 降旧表
  • 表重新创建新表的所有索引

当然这需要一定的时间来复制你的所有“600多万条记录”。 此外,整个表将锁定数据加载时间with (holdlock, tablockx)

更改它使用ALTER列,但随后的数据库不 的是,也许是因为我们经过努力几个指标

这是不正确的。

如果涉及到任何索引,并且只有具有该字段广告的索引included专用于其数据类型nvarchar(max),则服务器会给您一个错误,并且在您删除该索引之前不会执行任何操作。如果没有索引受到影响,它就不能“在那之后不起作用,也许是因为我们有几个索引”。

请再想一想您想要实现更改该列的类型。如果你认为你会获得一些空间,那么这是错误的。

nvarchar(max)传递给nchar(max)(从可变长度类型为固定长度类型)你的数据会占用更多的空间比现在因为你要存储固定数目字节,即使该列null或1-2-3之后字符。

如果你只是想改变max到水木清华一样,例如8000,你一无所获,因为这不是真正的数据大小,但只有最大尺寸的数据可以有。如果你的字符串大小是足够小,你nvarchar(max)已经存储为in-row data,而不是LOB data,因为它是与ntext

+0

所有100%正确,已经添加了一个。我想提出的一点是,改变为固定长度的VARCHAR可能不是为了消除空间,而是为了防止某人输入LOB数据。如果系统的功能没有必要,我肯定会停止发生这种情况。 –

+0

非常感谢,我真的想将它转换为nvarchar(xxx)。这样做之前为我们节省了不少专栏的空间。 – Techy