在SQL 2008/12中压缩VARCHAR - 没有看到结果

时间:2012-03-20 16:10:15

标签: sql-server sql-server-2008 sql-server-2008-r2

我一直在尝试使用SQL Server进行压缩,但到目前为止我还没有看到我预期的结果。

要测试我已经创建了一个包含单个VARCHAR(8000)列的新表,并在其中插入了100k行。每行包含大约500个单词的文本,使用ZIP压缩可以节省90%的空间。

我正在使用命令EXEC sp_estimate_data_compression_savings 'dbo', 'MyTable', NULL, NULL, 'PAGE' ;来检查使用PAGE压缩节省多少空间,但它告诉我根本不会有太多空间。结果如下:

object_name schema_name index_id    partition_number    size_with_current_compression_setting(KB)   size_with_requested_compression_setting(KB) sample_size_with_current_compression_setting(KB)    sample_size_with_requested_compression_setting(KB)
MyTable      dbo        0         1                       94048                                                  93440                               40064                                              39808

基本上没有储蓄。我哪里错了?

PS。我已尝试使用NVARCHAR(4000)列进行相同的实验,压缩确实显示了那里的节省,但我相信这是因为压缩强制使用1个字符而不是2个数据不需要2个字符。它实际上并没有像ZIP那样压缩数据。

2 个答案:

答案 0 :(得分:2)

如果数据是在行外推送的(可能会在VARCHAR(8000)列上发生),那么您就不会对其进行任何压缩。 Only the in-row data is compressed

  

由于它们的大小,有时会存储大值数据类型   与特殊用途页面上的正常行数据分开。数据   压缩不适用于单独存储的数据。

答案 1 :(得分:1)

SQL Server中的页面压缩使用前缀和字典方法来压缩数据。它不能(并且您不希望它)查看整个数据集以找出最佳压缩。它一次只能查看一页数据。当页面中的每个连续行与前一行的差异最小时,可以获得最佳结果。实现此目的的唯一方法是使SQL Server在每个页面中物理排列行,以使它们在行与行之间尽可能不同。我们可以通过在字段或字段集上创建聚簇索引来实现这一点,这些索引可以保证数据行的物理排列遵循从行到行模型的最小变化。

在您提供的示例中,单个字段中的一堆单词,可以实现适当的压缩程度。这听起来像文本段落,无论它们如何物理排列,都会有很大的不同。

SQL Server用于压缩数据的方法使其能够检索任何行的内容,而无需解压缩整个页面。