我一直在尝试使用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那样压缩数据。
答案 0 :(得分:2)
如果数据是在行外推送的(可能会在VARCHAR(8000)
列上发生),那么您就不会对其进行任何压缩。 Only the in-row data is compressed:
由于它们的大小,有时会存储大值数据类型 与特殊用途页面上的正常行数据分开。数据 压缩不适用于单独存储的数据。
答案 1 :(得分:1)
SQL Server中的页面压缩使用前缀和字典方法来压缩数据。它不能(并且您不希望它)查看整个数据集以找出最佳压缩。它一次只能查看一页数据。当页面中的每个连续行与前一行的差异最小时,可以获得最佳结果。实现此目的的唯一方法是使SQL Server在每个页面中物理排列行,以使它们在行与行之间尽可能不同。我们可以通过在字段或字段集上创建聚簇索引来实现这一点,这些索引可以保证数据行的物理排列遵循从行到行模型的最小变化。
在您提供的示例中,单个字段中的一堆单词,可以实现适当的压缩程度。这听起来像文本段落,无论它们如何物理排列,都会有很大的不同。
SQL Server用于压缩数据的方法使其能够检索任何行的内容,而无需解压缩整个页面。