VARCHAR(MAX) 比 NVARCHAR(MAX) 占用更多空间

Low*_*n M 5 sql-server disk-space sql-server-2012 blob unicode

我在 SQL Server 2012 Enterprise Edition 中有一个表,其中包含约 100GB 的数据。这些数据的大部分归因于NVARCHAR(MAX)平均长度为 4500 个字符的单个列。它存储由不需要 Unicode 字符的应用程序压缩的数据。

由于NVARCHAR每个字符占用两个字节并VARCHAR占用一个字节,我推测我可以通过切换表来减少一些存储空间。但是,一旦我将列更改为VARCHAR(MAX),表格就会膨胀到 155GB。

我知道 SQL 可能会使用Unicode 压缩,但文档指出这不适用于NVARCHAR(MAX)它,因此它不可能被使用。

那么为什么我的桌子变大了这么多?

桌子:

CREATE TABLE [dbo].[Table](
    [RecordLocator] [char](6) NOT NULL,
    [CreateDate] [date] NOT NULL,
    [SystemId] [varchar](40) NOT NULL,
    [EventXML] [nvarchar](max) NULL, --Not XML, compressed XML as characters
    [UpdateUTCTimeStamp] [datetime2](7) NOT NULL,
    [DeleteDate] [date] NULL,
 CONSTRAINT [PK_Table] PRIMARY KEY CLUSTERED 
(
    [RecordLocator] ASC,
    [CreateDate] ASC,
    [SystemId] ASC,
    [DeleteDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 75) ON [PRIMARY]
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)

补充说明:

  • 表设计并不理想,我也在努力与第三方开发人员进行更改。
  • 表在 DeleteDate 上分区 - 也不理想,但现在需要有效地换出旧数据
  • 表没有启用行或页压缩
  • table alter 前后的表行增长可以忽略不计
  • 哦,我确实运行了sp_spaceused,但未能添加输出:

     name   rows        reserved        data            index_size  unused
     Table  11407899    160531008 KB    159465328 KB    525200 KB   540480 KB
    
    Run Code Online (Sandbox Code Playgroud)

归档时间:

查看次数:

2108 次

最近记录:

7 年,11 月 前