我需要更新大小约为18GB的SQL Server数据库,才能将大量TEXT
列更改为NVARCHAR(MAX)
。
我遇到的问题是执行所有alter table
命令后,数据库的大小最终接近26GB。我了解从这里开始使用NVARCHAR(MAX)
将使数据库增长减慢,但是我有什么办法防止这种膨胀?
我需要更新大小约为18GB的SQL Server数据库,才能将大量TEXT
列更改为NVARCHAR(MAX)
。
我遇到的问题是执行所有alter table
命令后,数据库的大小最终接近26GB。我了解从这里开始使用NVARCHAR(MAX)
将使数据库增长减慢,但是我有什么办法防止这种膨胀?
Answers:
我希望这篇文章对您有所帮助。
http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx
关键事实:
当您将列从TEXT / NTEXT更改为NVARCHAR(MAX)时,数据的存储方式不变,它仅更新表元数据。数据结构仅在下次更改值时才更改。可以通过运行以下命令立即完成此操作:
update mytable set mycolumn1 = mycolumn1
如果将默认表选项设置用于NVARCHAR(MAX),则表中的数据将更大。
-在将设置更改为适合您的需求之前,您需要查看表选项设置和环境。
如果您将alter table语句与update table语句一起使用,则表的大小最终将缩小。
简而言之,如果您运行update语句,强制更改数据结构的存储,则数据库大小将按预期减小。
编辑:正如您提到的是TEXT而不是NTEXT一样,您在空间上获得的收益将不如您想象的那么明显。NTEXT占用的空间是TEXT的两倍,但是与此同时,您应该期望NVARCHAR(MAX)占用的空间是TEXT的一半。根据我的计算,您的原始数据库大小几乎没有变化。
可能是您的问题的一个疏漏,但您是说TEXT到NVARCHAR(max),而不是NTEXT到NVARCHAR(max)。如果这是您真正在做的事情,那么您正在从ANSI更改为UNICODE,并且不要惊讶它占用了更多空间(单字节字符与多字节字符)。
TEXT
字段的大小-将unicode占用的存储空间恰好是ANSI的两倍。