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

Aid*_*ess 8 sql-server

我需要更新一个大小约为 18GB 的​​ SQL Server 数据库,以将大量TEXT列更改为NVARCHAR(MAX).

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

RoK*_*oKa 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您使用 NVARCHAR(MAX) 的默认表选项设置,则表中的数据将更大。

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

  • 如果您遵循带有更新表语句的更改表语句,您的表大小最终会缩小。

简而言之,如果您运行 update 语句,强制更改数据结构的存储,您的数据库大小会更小,正如预期的那样。

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


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

  • 您能否在这里总结一下重要的事实,以防链接失效。 (2认同)

spa*_*dba 6

可能是您的问题的疏忽,但您说的是 TEXT 到 NVARCHAR(max) 而不是 NTEXT 到 NVARCHAR(max)。如果这是您真正在做的事情,那么您正在从 ANSI 更改为 UNICODE,您应该不会对它占用更多空间(单字节字符与多字节字符)感到惊讶。

  • 您是否尝试过 RoKa 的建议? (2认同)
  • @JNK ...除非在 2008 R2 或更高版本中使用压缩,其中 Unicode 压缩会将存储在 NVARCHAR 中的 ASCII 字符视为 VARCHAR。 (2认同)