更改大型SQL Server数据库中的列大小会导致问题
我有一个包含6亿多条记录和NVARCHAR(MAX)
列的表。更改大型SQL Server数据库中的列大小会导致问题
我需要的列大小变更为固定大小,但我通常有两个选择与这个大DB:使用SSMS的设计师,这需要很长的时间,也许永远无法完成它
- 变化它使用
- 变化
Alter Column
,但随后的数据库不后工作,也许是因为我们有几个指标
我的问题是:什么是可能的解决方案,以实现无差错预期的效果?
注:我使用Azure上的SQL Server和这个数据库是在生产
谢谢
澄清:其实,我有我想要把
新的长度范围内的所有当前数据
更改完成
什么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
所有100%正确,已经添加了一个。我想提出的一点是,改变为固定长度的VARCHAR可能不是为了消除空间,而是为了防止某人输入LOB数据。如果系统的功能没有必要,我肯定会停止发生这种情况。 –
非常感谢,我真的想将它转换为nvarchar(xxx)。这样做之前为我们节省了不少专栏的空间。 – Techy
'但随后的数据库无法正常工作后that'请详细总是和张贴任何错误,文字 – TheGameiswar
你想传递给固定长度的列NCHAR(m),或者你想要的只是将最大可能大小更改为固定值,但将列的长度保留为可变长度(我的意思是,从nvarchar(max)传递给nvarchar (M))? – sepupic