SQL Server alter table将TEXT更改为NVARCHAR(MAX),大大增加了数据库大小


8

我需要更新大小约为18GB的SQL Server数据库,才能将大量TEXT列更改为NVARCHAR(MAX)

我遇到的问题是执行所有alter table命令后,数据库的大小最终接近26GB。我了解从这里开始使用NVARCHAR(MAX)将使数据库增长减慢,但是我有什么办法防止这种膨胀?


2
哦,不要在这里创建相同的问题。只需在SO上标记它,mod就会立即将其迁移到这里:-)。现在有人需要合并/清理..etc。
玛丽安

2
数据库较大还是日志很大?
亚伦·伯特兰

抱歉,玛丽安,现在明白了……
艾丹·劳瑞丝,2013年

Aaron,MDF文件要大得多。...几乎大10GB
Aidan Lawless

Answers:


7

我希望这篇文章对您有所帮助。

http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx

关键事实:

  • 默认情况下,TEXT和NTEXT将文本值存储在LOB结构中
  • 默认情况下,NVARCHAR(MAX)将文本值存储在表结构中(除非它超过8000个字节)
  • 当您将列从TEXT / NTEXT更改为NVARCHAR(MAX)时,数据的存储方式不变,它仅更新表元数据。数据结构仅在下次更改值时才更改。可以通过运行以下命令立即完成此操作:

      update mytable set mycolumn1 = mycolumn1
  • 如果将默认表选项设置用于NVARCHAR(MAX),则表中的数据将更大。

    -在将设置更改为适合您的需求之前,您需要查看表选项设置和环境。

  • 如果您将alter table语句与update table语句一起使用,则表的大小最终将缩小。

简而言之,如果您运行update语句,强制更改数据结构的存储,则数据库大小将按预期减小。

编辑:正如您提到的是TEXT而不是NTEXT一样,您在空间上获得的收益将不如您想象的那么明显。NTEXT占用的空间是TEXT的两倍,但是与此同时,您应该期望NVARCHAR(MAX)占用的空间是TEXT的一半。根据我的计算,您的原始数据库大小几乎没有变化。


特别鸣谢http://www.douglubey.com/


2
您能否在这里总结重要的事实,以防链接可能失效。
斯蒂芬·罗兰德

如其他答案中所述,TEX​​T vs. NTEXT将对存储产生影响,但影响不如您建议的那么大。
RoKa 2013年

谢谢...我已经推迟加入多年了...很高兴来到这里。
RoKa 2013年

感谢RoKA,这对几个有问题的表产生了重大影响。我将再次还原数据库,并逐步执行以查看影响。再次感谢.....
Aidan Lawless 2013年

这是我的荣幸。
RoKa 2013年

6

可能是您的问题的一个疏漏,但您是说TEXT到NVARCHAR(max),而不是NTEXT到NVARCHAR(max)。如果这是您真正在做的事情,那么您正在从ANSI更改为UNICODE,并且不要惊讶它占用了更多空间(单字节字符与多字节字符)。


是的,多数民众赞成在我正在做的事情……尽管基于一些简单的计算,它并不能说明增加的幅度。
Aidan Lawless

2
您是否尝试过RoKa的建议?
spaghettidba

1
@AidanLawless这些是什么计算?数据库的大小至少应增加现有TEXT字段的大小-将unicode占用的存储空间恰好是ANSI的两倍。
JNK

2
@JNK ...除非在2008 R2或更高版本中使用压缩,否则Unicode压缩将把存储在NVARCHAR中的ASCII字符视为VARCHAR。
亚伦·伯特兰
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.