SQL Server数据表压缩:行压缩与页压缩操作指南

Miles
Miles
发布时间:2026-10-16| 6人浏览过
原创

SQL Server的数据压缩功能旨在减小数据在磁盘上的占用量,从而提升磁盘I/O效率。主要包含行压缩(Row Compression)和页压缩(Page Compression)两种模式。行压缩通过将固定长度数据类型转换为可变长度来节省空间,适合写入频繁的表;页压缩则在行压缩基础上进一步对重复值进行去重,适合以读取为主的大表。本文将详细介绍这两种压缩方式的原理、适用场景以及通过SSMS界面和T-SQL语句的具体操作方法。

概述

SQL Server的性能在很大程度上取决于磁盘I/O的效率。自SQL Server 2008起引入的数据压缩功能,能够有效减少数据的物理存储空间。压缩可应用于堆表、聚集索引表、非聚集索引表、索引视图及分区表。

支持压缩的数据类型

常见的数值、日期及二进制数据类型均支持压缩,包括:smallint、int、bigint、decimal、numeric、real、float、money、smallmoney、bit、datetime、datetime2、datetimeoffset、char、nchar、binary以及rowversion等。

行压缩 (Row Compression)

行压缩改变了数据的物理存储结构,但不需要修改应用程序代码。其核心机制是将固定长度的数据存储格式转换为可变长度存储,从而仅保留实际数据所需的字节数。例如,原本占用4字节的int类型,若实际值为5,则仅需1个字节存储。

第1步:通过SSMS进行行压缩

适用于熟悉图形界面的用户。

  • 压缩表(含聚集索引):在对象资源管理器中定位目标表 → 右键点击 → 选择“存储” → “管理压缩” → 勾选“对所有分区使用相同压缩类型” → 在右侧下拉菜单中选择 Row → 点击“立即执行” → 完成。
ALTER TABLE [dbo].[AnnexFileList] REBUILD PARTITION = ALL
WITH ( DATA_COMPRESSION = ROW );
注意:上述脚本仅重新生成堆表或聚集索引。如果表中存在非聚集索引,需单独对其进行压缩操作。
  • 压缩非聚集索引:在对象资源管理器中定位目标索引 → 右键点击 → 选择“存储” → “管理压缩” → 勾选“对所有分区使用相同压缩类型” → 在右侧下拉菜单中选择 Row → 点击“立即执行” → 完成。
ALTER INDEX [PK_ANNEXFILELIST]
    ON [dbo].[AnnexFileList]   REBUILD PARTITION = ALL
    WITH ( DATA_COMPRESSION = ROW );

第2步:通过T-SQL进行行压缩

对于需要脚本化管理的场景,可以使用以下命令:

  • 重构现有表的聚集索引:
    -- 在现有表上进行行压缩
    alter table ceshi rebuild with(data_compression=row);
  • 重构现有表的非聚集索引:
    -- 对特定非聚集索引进行行压缩
    alter index new_name on ceshi rebuild with(data_compression=row);
    
  • 创建新表时直接启用压缩:
    create table yasuo
    (
        id int primary key,
        name varchar(50),
        mail varchar(50)
    )
    with (data_compression=row);

若在创建表时指定了行压缩,数据在插入过程中会自动按照行压缩格式存储。

页压缩 (Page Compression)

页压缩在行压缩的基础上增加了两项增强功能:前缀压缩(Prefix Compression)和字典压缩(Dictionary Compression)。

  • 前缀压缩:扫描每一列,找出重复的前缀值,将这些值存储在页头部的压缩信息区,并将列中的实例替换为指向该信息的引用。
  • 字典压缩:在整个页面范围内搜索重复值(不限于单列),找到后将重复值移至页头,并用指针替代原值。

页压缩能提供更高的压缩率,尤其适用于重复数据较多的列。但需要注意,由于需要更多的CPU计算来进行压缩和解压,页压缩可能会略微增加处理器的负载。

实施注意事项

  1. 内存数据状态:数据库引擎在内存中缓存的是解压后的数据。如果启用了压缩,加载到内存的数据会先解压缩供SQL Server处理,这会增加CPU开销。
  2. 新增数据:在执行INSERT操作时,新行的数据也会自动应用行或页压缩算法进行存储。
  3. 更新与删除:
    • 行压缩对象在更新后通常保持当前的压缩级别。
    • 页压缩在更新或删除操作后,可能需要重新评估并重新计算压缩,具体取决于受影响的数据量和分布情况。

选择策略:使用哪种压缩?

根据业务场景选择合适的压缩类型可以平衡空间节省与系统开销:

  • 行压缩 (Row):适用于需要频繁进行更新、插入操作的表。它提供了较好的空间节省同时保持了较低的CPU开销。
  • 页压缩 (Page):适用于主要执行读取操作(如报表查询、数据分析)且数据重复率较高的表。它能提供更高的压缩比,适合读多写少的场景。

以上就是关于SQL Server数据表压缩的详细内容,更多关于SQL Server性能优化与T-SQL操作的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。