官方文档
https://learn.microsoft.com/zh-cn/sql/relational-databases/data-compression/data-compression?view=sql-server-ver16
https://learn.microsoft.com/zh-cn/sql/t-sql/functions/compress-transact-sql?view=sql-server-ver16

结论:

1、Sqlserver支持针对行存储表和索引的行和页压缩,并且支持针对列存储表和索引的列存储和列存储存档压缩。对于行存储表和索引,使用数据压缩功能可帮助减小数据库的大小。 除了节省空间之外,数据压缩还可以帮助提高 I/O 密集型工作负荷的性能,因为数据存储在更少的页中,查询需要从磁盘读取的页更少。 但是,在与应用程序交换数据时,在数据库服务器上需要额外的 CPU 资源来压缩和解压缩数据。 您可以在以下数据库对象上配置行和页压缩:存储为堆的整个表、存储为聚集索引的整个表、整个非聚集索引、整个索引视图、对于已分区表和已分区索引,可为每个分区配置压缩选项,且对象的各个分区的压缩设置不必相同。
2、压缩功能不可用于系统表。
3、通过压缩可在一页上存储更多的行,但不会更改表或索引的最大行大小。
4、当指定分区列表时,可以将各个分区的压缩类型设置为 ROW、PAGE 或 NONE。 如果未指定分区列表,将使用语句中指定的数据压缩属性来设置所有分区。 创建表或索引时,除非指定了其他压缩设置,否则数据压缩将设置为 NONE。 修改表时,除非指定了其他压缩设置,否则将保留现有压缩设置。
5、当最大行大小加上压缩开销超过最大行大小 8060 个字节时,不能对表启用压缩功能。 例如,不能压缩具有 c1 CHAR(8000) 和 c2 CHAR(53) 列的表,因为存在额外的压缩开销。
create table t12345 (c1 CHAR(8000) , c2 CHAR(50))–正常创建
create table t123456 (c1 CHAR(8000) , c2 CHAR(60))–无法创建,有报错:Creating or altering table ‘t123456’ failed because the minimum row size would be 8067, including 7 bytes of internal overhead. This exceeds the maximum allowable table row size of 8060 bytes.
6、非聚集索引不继承表的压缩属性。 若要压缩索引,必须显式设置索引的压缩属性。 默认情况下,创建索引时,索引的压缩设置会设置为NONE。
7、对堆表创建聚集索引时,聚集索引会继承该堆表的压缩状态,除非指定了另一压缩状态。
8、如果堆表配置为页级压缩,则只有在以下情况下,页才会进行页级压缩:
在启用大容量优化的情况下大容量导入数据。
数据是使用 INSERT INTO … WITH (TABLOCK) 语法插入的,并且表没有非聚集索引。
表是通过执行带 PAGE 压缩选项的 ALTER TABLE … REBUILD 语句重新生成的。
9、通过 DML 操作被分配到堆表中的新页面不会使用 PAGE 压缩,除非重新生成该堆。 重新生成堆的方法有:删除压缩然后重新应用压缩,或者创建聚集索引然后再删除聚集索引。
10、若要更改堆表的压缩设置,要求对表重新生成所有非聚集索引,以便它们具有指向堆表中的新行位置的指针。
11、可以联机或脱机启用或禁用 ROW 或 PAGE 压缩功能。 当执行联机操作时,对堆启用压缩功能是单线程的。
12、启用或禁用行压缩或页压缩的磁盘空间要求与创建或重新生成索引时的磁盘空间要求相同。 对于已分区数据,可以通过每次对一个分区启用或禁用压缩功能来减少所需的空间。
13、压缩索引时,可以使用行压缩和页压缩来压缩叶级页。 非叶级页不接收页压缩。
14、当使用页压缩时,将仅使用行压缩来压缩索引的非叶级别页。
15、使用页压缩压缩表和索引的叶级别的过程由按以下顺序进行的三个操作组成:行压缩、前缀压缩、字典压缩。可以简单理解:PAGE压缩包括ROW压缩,所以PAGE压缩率更高

DATA_COMPRESSION = {NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE}

NONE:不压缩表或指定的分区。 此选项不适用于列存储表。
ROW:使用行压缩来压缩表或指定的分区。 此选项不适用于列存储表。
PAGE:使用页压缩来压缩表或指定的分区。 此选项不适用于列存储表。
COLUMNSTORE:适用于SQL Server(SQL Server 2014 (12.x) 及更高版本)和 Azure SQL 数据库。仅适用于列存储表。
COLUMNSTORE_ARCHIVE:适用于:SQL Server(SQL Server 2014 (12.x) 及更高版本)和 Azure SQL 数据库。仅适用于列存储表。

使用页压缩压缩表和索引的叶级别的过程由按以下顺序进行的三个操作组成:行压缩、前缀压缩、字典压缩

行压缩
减少了与记录相关联的元数据开销。 此元数据为有关列、列长度和偏移量的信息。 在某些情况下,元数据开销可能大于旧的存储格式。
它对于数值类型(例如, integer、 decimal和 float)和基于数值的类型(例如, datetime 和 money)使用可变长度存储格式。
它通过使用不存储空字符的可变长度格式来存储定长字符串。
将对所有数据类型的 NULL 和 0 值进行优化,从而使它们不占用任何字节。
不受压缩影响的字段类型:tinyint、smalldatetime、date、time、varchar、text、nvarchar、ntext、varbinary、xml

前缀压缩
对于要压缩的每一页,前缀压缩采用以下步骤:
对于每一列,将确定一个值,此值可用于减少每一列中的值的存储空间。
将创建表示每一列的前缀值的行,并将其存储在紧随页头之后的压缩信息 (CI) 结构中。
列中重复的前缀值将由指向对应前缀的引用进行替换。 如果行中的值与所选前缀值并不完全匹配,则仍会指示存在部分匹配。

字典压缩
前缀压缩完成后,将应用字典压缩。 字典压缩搜索页面上任意位置的重复值,然后将它们存储在 CI 区域中。 与前缀压缩不同,字典压缩不局限于一列。 字典压缩可以替换页面上任意位置出现的重复值。

Sqlserver表和索引压缩相关推荐

  1. sqlserver表压缩

    行压缩,表被压缩后非聚集索引需要单独压缩 --表压缩 ALTER TABLE test REBUILD PARTITION = ALL WITH ( DATA_COMPRESSION = ROW ); ...

  2. powershell 压缩_如何使用PowerShell返回数据使用,索引压缩和行信息

    powershell 压缩 背景 (Background) We recently inherited a database environment where we're facing signif ...

  3. db2 删除schema中所有表_常用SQL系列之(六):删除方式、数据库、表及索引元信息查询等...

    本系统为@牛旦教育IT课堂在微头条上的内容, 为便于查阅,特辑录于此,都是常用SQL基本用法.. 前两篇连接: (一):SQL点滴(查询篇):数据库基础查询案例实战 (二):SQL点滴(排序篇):数据 ...

  4. oracle表空间,角色,权限,表,索引,序列号,视图,同义词,约束条件,存储函数和过程,常用数据字典,基本数据字典信息,查看VGA信息,维护表空间,创建表空间等信息

    查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * fr ...

  5. ElasticSearch探索之路(四)索引原理:倒排索引、列式存储、Fielddata、索引压缩、联合索引

    文章目录 倒排索引 Term dictionary与Term index 列式存储--Doc Values Fielddata 索引压缩 FOR编码 Roaring Bitmaps 联合索引 倒排索引 ...

  6. 第十三章——表和索引分区(2)——使用拆分删除和加载大数据

    原文: 第十三章--表和索引分区(2)--使用拆分删除和加载大数据 前言: 很多时候需要对大数据量进行归档或者删除,并周期性加载大数据量到一个大表中,现在来做个简单的例子,你经常需要删除大数据量表中的 ...

  7. InnoDB——架构、日志、表和索引

    Published On: https://blog.2014bduck.com/archives/241 前言 写这篇博文是为了将自己学习完InnoDB的内容梳理一遍.InnoDB是个很复杂很庞大的 ...

  8. 查询所有表、索引、视图信息的SQL语句-Mysql/oracle/sql server的不同实现方式

    注:所有查询默认在管理员用户下进行 ----------------------------------Mysql中------------------------------------------ ...

  9. oracle转换表结构,SQLServer表结构转换成Oracle表结构

    /******************** * function:sqlserver 表结构转换成Oralce 表结构,不支持索引以及自动增长 **********************/ --取消 ...

最新文章

  1. ACMNO.35 C语言-宏润年 给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y)
  2. js数组中indexOf/filter/forEach/map/reduce详解
  3. python 寻找旋转排序数组中的最小值
  4. 不会英语能学oracle吗,英语非常差该怎么学啊?
  5. closehandle()函数
  6. Spring Data Solr入门
  7. mysql 行级锁 索引_mysql 行级锁 索引唯一值
  8. 大学计算机老师都是IT行业顶尖,却不做程序员,你知道为什么吗
  9. raster | 多图层栅格对象的一些处理方法
  10. 不需要Excel的可视化大屏,究竟可以多炫酷?附20份模板
  11. java jar 启动脚本
  12. 软考高项比中项在难度上高多少?
  13. 微信小程序401unauthorized授权问题解决方法
  14. COCO2017 test-dev评估
  15. 神舟 桌面显示计算机,神舟笔记本双显卡怎么切换不盯道你的笔记本型号
  16. 波士顿大学 计算机专业,波士顿大学本科计算机专业课程设置是怎样的?
  17. 做uni-app时,遇到后台返回base64码,将base64码转为图片,但是图片没有显示出来的解决方法
  18. Mock测试-优缺点分析
  19. 【Vue3.0移动端项目--旅游网】-- 房屋详情页创建以及房屋详情图片展示
  20. Oracle SQL 高版本相关

热门文章

  1. Delphi 音频播放
  2. latex 公式如何换行
  3. 谈谈你的移动端适配方案有哪些
  4. 黑客Un Oracle注射笔记-知己知彼百战不殆
  5. 深度学习入门:基于Python的理论与实现③
  6. CSS3 弹性布局 flex
  7. linux中可重入函数、不可重入函数
  8. 查询银行柜员半小时内办理业务的记录
  9. 恒压板框过滤实验数据处理_板框压滤机滤布的选配原则
  10. winform的TreeView动画效果