如何对波浪数据进行数据压缩的基本类型?


项目
05/30/2023
适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例SQL Server、Azure SQL 数据库 和 Azure SQL 托管实例 支持针对行存储表和索引的行和页压缩,并且支持针对列存储表和索引的列存储和列存储存档压缩。对于行存储表和索引,使用数据压缩功能可帮助减小数据库的大小。 除了节省空间之外,数据压缩还可以帮助提高 I/O 密集型工作负荷的性能,因为数据存储在更少的页中,查询需要从磁盘读取的页更少。 但是,在与应用程序交换数据时,在数据库服务器上需要额外的 CPU 资源来压缩和解压缩数据。 您可以在以下数据库对象上配置行和页压缩:存储为堆的整个表。
存储为聚集索引的整个表。
整个非聚集索引。
整个索引视图。
对于已分区表和已分区索引,可为每个分区配置压缩选项,且对象的各个分区的压缩设置不必相同。
对于列存储表和索引,所有列存储表和索引始终使用列存储压缩,并且用户无法对此进行配置。 在您能够付出额外的时间和 CPU 资源来存储和检索数据的情况下,使用列存储存档压缩可进一步减少数据大小。
您可以在以下数据库对象上配置列存储存档压缩:整个列存储表或整个聚集列存储索引。
因为列存储表存储为聚集列存储索引,所有两种方法具有相同的结果。
整个非聚集列存储索引。
对于列存储表和列存储索引,可为每个分区配置存档压缩选项,且各个分区的存档压缩设置不必相同。
注意此外,还可以使用 GZIP 算法格式来压缩数据。 这是一个附加步骤,最适合压缩部分数据时归档旧数据以进行长期存储。 无法为使用 COMPRESS 函数压缩的数据创建索引。 有关详细信息,请参阅 COMPRESS (Transact-SQL) 。行和页压缩注意事项使用行压缩和页压缩时,应注意以下事项:在 Service Pack 或后续版本中,有关数据压缩的详细信息如有更改,恕不另行通知。
在 Azure SQL 数据库 中提供压缩功能
不是 SQL Server的每个版本都提供压缩功能。 有关详细信息,请参阅 SQL Server 2016 的版本支持的功能、SQL Server 2017 的版本和支持的功能以及 SQL Server 2019 的版本和支持的功能。
压缩功能不可用于系统表。
通过压缩可在一页上存储更多的行,但不会更改表或索引的最大行大小。
当最大行大小加上压缩开销超过最大行大小 8060 个字节时,不能对表启用压缩功能。 例如,不能压缩具有 c1 CHAR(8000) 和 c2 CHAR(53) 列的表,因为存在额外的压缩开销。 当使用 vardecimal 存储格式时,会在启用此格式时执行行大小检查。 对于行压缩和页压缩,在最初压缩对象时会执行行大小检查,以后在每插入或修改一行时也都会执行这一检查。 压缩功能要求遵循下面两条规则:
固定长度类型的更新必须始终成功。
禁用数据压缩必须总是成功。 即使已压缩的行可以容纳在页面中(意味着它小于 8060 个字节), SQL Server 也不允许对哪些在未压缩时无法容纳在行中的更新。
启用数据压缩时不会压缩行外数据。 例如,大于 8060 字节的 XML 记录将使用不压缩的行外页面。 - 多个数据类型不受数据压缩的影响。 有关更多详细信息,请参阅行压缩对存储的影响。
当指定分区列表时,可以将各个分区的压缩类型设置为 ROW、PAGE 或 NONE。 如果未指定分区列表,将使用语句中指定的数据压缩属性来设置所有分区。 创建表或索引时,除非指定了其他压缩设置,否则数据压缩将设置为 NONE。 修改表时,除非指定了其他压缩设置,否则将保留现有压缩设置。
如果指定分区列表或分区超出范围,将生成错误。
非聚集索引不继承表的压缩属性。 若要压缩索引,必须显式设置索引的压缩属性。 默认情况下,创建索引时,索引的压缩设置会设置为 NONE。
对堆创建聚集索引时,聚集索引会继承该堆的压缩状态,除非指定了另一压缩状态。
如果堆配置为页级压缩,则只有在以下情况下,页才会进行页级压缩:
在启用大容量优化的情况下大容量导入数据。
数据是使用 INSERT INTO ... WITH (TABLOCK) 语法插入的,并且表没有非聚集索引。
表是通过执行带 PAGE 压缩选项的 ALTER TABLE ... REBUILD 语句重新生成的。
通过 DML 操作被分配到堆中的新页面不会使用 PAGE 压缩,除非重新生成该堆。 重新生成堆的方法有:删除压缩然后重新应用压缩,或者创建聚集索引然后再删除聚集索引。
若要更改堆的压缩设置,要求对表重新生成所有非聚集索引,以便它们具有指向堆中的新行位置的指针。
可以联机或脱机启用或禁用 ROW 或 PAGE 压缩功能。 当执行联机操作时,对堆启用压缩功能是单线程的。
启用或禁用行压缩或页压缩的磁盘空间要求与创建或重新生成索引时的磁盘空间要求相同。 对于已分区数据,可以通过每次对一个分区启用或禁用压缩功能来减少所需的空间。
若要确定分区表中分区的压缩状态,请查询 data_compression 目录视图的 sys.partitions 列。
压缩索引时,可以使用行压缩和页压缩来压缩叶级页。 非叶级页不接收页压缩。
由于大小的关系,大值数据类型有时不与普通行数据存储在一起,而是存储在特殊用途的页上。 对于单独存储的数据,数据压缩不可用。
在 SQL Server 2005 (9.x) 中实现 vardecimal 存储格式的表会在升级时保留该设置。 可以将行压缩应用于具有 vardecimal 存储格式的表。 但是,由于行压缩是 vardecimal 存储格式的超集,因此没有理由保留 vardecimal 存储格式。 将 vardecimal 存储格式与行压缩相结合时, 十进制 值不会获得额外的压缩。 可以将页面压缩应用于具有 vardecimal 存储格式的表;但是, vardecimal 存储格式列可能不会实现额外的压缩。
注意所有受支持的 SQL Server 版本都支持 vardecimal 存储格式;但是,由于数据压缩达到相同的目标,因此已弃用 vardecimal 存储格式。 后续版本的 Microsoft SQL Server 将删除该功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。
列存储和列存储存档压缩列存储表和索引始终使用列存储压缩进行存储。 您可以通过配置称作存档压缩的附加压缩,进一步减少列存储数据的大小。
为了执行存档压缩, SQL Server 将对数据运行 Microsoft XPRESS 压缩算法。 通过使用以下数据压缩类型添加或删除存档压缩:通过 COLUMNSTORE_ARCHIVE 数据压缩可使用存档压缩来压缩列存储数据。
使用 COLUMNSTORE 数据压缩可对存档压缩执行解压缩。 这样生成的数据可以继续使用列存储压缩进行压缩。
若要添加存档压缩,请将 ALTER TABLE (Transact-SQL)
或 ALTER INDEX (Transact-SQL)
与 REBUILD 选项和 DATA COMPRESSION = COLUMNSTORE_ARCHIVE。例如:ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE_ARCHIVE ON PARTITIONS (2, 4)
);
若要删除存档压缩并将数据还原到列存储压缩,请使用 ALTER TABLE (Transact-SQL)
或 ALTER INDEX (Transact-SQL)
,同时使用 REBUILD 选项和 DATA COMPRESSION = COLUMNSTORE。例如:ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
DATA_COMPRESSION = COLUMNSTORE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE
);
ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE ON PARTITIONS (2, 4)
);
下一示例将数据压缩设置为对于某些分区是列存储,对于其他分区是列存储存档。ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = COLUMNSTORE
ON PARTITIONS (4, 5),
DATA COMPRESSION = COLUMNSTORE_ARCHIVE
ON PARTITIONS (1, 2, 3)
);
性能使用存档压缩对列存储索引进行压缩,导致索引执行速度慢于未进行存档压缩的列存储索引。 仅在您能够付出额外的时间和 CPU 资源来压缩和检索数据时,才使用存档压缩。存档压缩的优点在于可减少存储,这对于不经常访问的数据很有用。 例如,如果您对每个月的数据都具有一个分区,并且您的大多数活动是针对最近月份的,则可以将较早月份的数据存档以便降低存储要求。元数据下面的系统视图包含有关聚集索引的数据压缩的信息:sys.indexes (Transact-SQL)
- type 和 type_desc 列包括 CLUSTERED COLUMNSTORE 和 NONCLUSTERED COLUMNSTORE。
sys.partitions (Transact-SQL)
- data_compression 和 data_compression_desc 列包括 COLUMNSTORE 和 COLUMNSTORE_ARCHIVE。
Transact-SQL) sp_estimate_data_compression_savings (过程也适用于列存储索引。对已分区表和索引的影响如果对已分区表和已分区索引使用数据压缩,则应注意以下事项:如果使用 ALTER PARTITION 语句拆分分区,则两个分区均继承原始分区的数据压缩属性。
合并两个分区时,生成的分区将继承目标分区的数据压缩属性。
若要切换分区,该分区的数据压缩属性必须与表的压缩属性匹配。
可以使用两种语法变体来修改已分区表或已分区索引的压缩:
下面的语法仅重新生成被引用分区:
ALTER TABLE <table_name>
REBUILD PARTITION = 1 WITH (
DATA_COMPRESSION = <option>
);
下面的语法通过对未引用的任何分区使用现有压缩设置来重新生成整个表:
ALTER TABLE <table_name>
REBUILD PARTITION = ALL WITH (
DATA_COMPRESSION = PAGE ON PARTITIONS(<range>),
...
);
已分区索引使用 ALTER INDEX 遵循同样的原则。
删除聚集索引时,除非修改了分区方案,否则相应的堆分区将保留其数据压缩设置。 如果分区方案已更改,则所有分区都将重新生成为未压缩状态。 若要删除聚集索引并更改分区方案,需要执行下列步骤:
删除聚集索引。
使用指定压缩选项的 ALTER TABLE ... REBUILD 选项来修改表。
若要删除聚集索引,脱机操作的执行速度很快,因为只删除较高级别的聚集索引。 如果联机删除聚集索引,则 SQL Server 必须重新生成堆两次,一次针对步骤 1,一次针对步骤 2。
压缩对复制的影响如果将数据压缩与复制一起使用,则应注意以下事项:当快照代理生成初始架构脚本时,新架构对表及其索引采用相同的压缩设置。 不能仅对表启用压缩,而不对索引启用压缩。
对于事务复制,项目架构选项决定了必须对哪些依赖对象和属性编写脚本。 有关详细信息,请参阅 sp_addarticle。
分发代理在应用脚本时,不对下级订阅服务器进行检查。 如果选择了压缩副本,则无法在下级订阅服务器上创建表。 在混合拓扑中,不启用压缩的复制。
对于合并复制,发布兼容性级别会替代架构选项,并确定脚本化的架构对象。
在混合拓扑中,如果不是必须支持新的压缩选项,则发布兼容级别应设置为下级订阅服务器版本。 否则,应在创建表后在订阅服务器上压缩表。
下表列出了在复制期间控制压缩的复制设置。用户意图
为表或索引复制分区方案
复制压缩设置
脚本编写行为
复制分区方案并在该分区上的订阅服务器上启用压缩。
True
True
对分区方案和压缩设置均编写脚本。
复制分区方案,但不压缩订阅服务器上的数据。
True
错误
对分区方案编写脚本,但不对分区的压缩设置编写脚本。
不复制分区方案,也不压缩订阅服务器上的数据。
False
False
不对分区和压缩设置编写脚本。
如果发布服务器上的所有分区均压缩,则压缩订阅服务器上的表,但不复制分区方案。
False
True
检查是否对所有分区均启用了压缩。在表级别对压缩编写脚本。
对其他 SQL Server 组件的影响适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例压缩发生在存储引擎中,数据以未压缩状态呈现给 SQL Server 的其他大部分组件。 这决定了其他组件上的压缩效果仅限于以下方面:大容量导入和导出操作导出数据时,即使采用本机格式,数据也以未压缩的行格式输出。 这会导致导出的数据文件的大小比源数据要大得多。
导入数据时,如果已对目标表启用压缩,则存储引擎会将数据转换为压缩的行格式。 这样所使用的 CPU 资源会比将数据导入未压缩表时使用的 CPU 资源多。
当使用页面压缩将数据批量导入堆时,批量导入操作尝试在插入数据时使用页面压缩来压缩数据。
压缩对备份和还原没有影响。
压缩对日志传送没有影响。
数据压缩与稀疏列不兼容。 因此,无法压缩包含稀疏列的表,也不能将稀疏列添加到压缩表。
启用压缩可以导致查询计划更改,因为数据是用不同的页数和每页不同的行数存储的。
请参阅行压缩的实现
页压缩的实现
Unicode 压缩的实现
CREATE PARTITION SCHEME (Transact-SQL)
CREATE PARTITION FUNCTION (Transact-SQL)
CREATE TABLE (Transact-SQL)
ALTER TABLE (Transact-SQL)
CREATE INDEX (Transact-SQL)
ALTER INDEX (Transact-SQL)
H.264和很多标准一样,都采用变换编码、基于运动补偿的帧间预测和熵编码的混合框架。大的不同是增加了帧内预测,变换采用整数变换,熵编码采用自适应的方法。压缩比高:在同等图像质量的条件下,采用H.264技术压缩后的码流,数据量只有MPEG-2的1/2;容错率高:H.264码流具有较强的抗误码特性,可适应丢包率高、干扰严重的信道,如IP和无线网络;网络适应性强:H.264提供了网络适应层,使得H.264的文件能容易地在不同网络上传输;计算复杂度高:H.264使用较高的计算复杂度,换取优越的性能,其复杂度相当于MPEG-2的2—3倍。选择一个.mp4或者.264文件。在码流分析仪软件中打开该文件,从几个层次进行分析:1)分析SPS和PPS里都包含哪些主要的信息,给出参数值。(例如分辨率、帧率、GOP结构等等)2) 以一个GOP为例,分析如下信息:(1)每个图像帧的类型及所用的编码比特数、QP值;并以图像帧号为横坐标、每帧所用比特数为纵坐标画出曲线图;以图像帧号为横坐标、每帧所用QP为纵坐标画出曲线图。(2)以第一个I帧作为分析对象,基于该帧图像的空间特性,分析每个宏块所采用的编码类型及其比例。(3)以第一个P帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。(4) 以某一个B帧作为分析对象,基于该帧图像的空间和时间特性,分析每个宏块所采用的编码类型及其比例。 选择一个.mp4或者.264文件,码流分析仪软件中打开
分析该文件的SPS、PPS以及GOP1)分析SPS(即Sequence Paramater Set,又称为序列参数集)包含的主要信息SPS语法图SPS实例nal_header先分析第一个NALUsize是14byte,起始码之后正好是14byte第一个字节是NAL的header
forbidden_zero_bit : 0静止位固定是0,也就是第7位为0
nal_ref_idc : 3第5第6位是11
header低5位表示类型,这里是SPS即低5位是7
于是第一个nalu header二进制为:0110 0111十六进制为0x67,和二进制解析一致profile_idc既然知道了这个NALU表示SPS,那么就以SPS的方式去进行解析,SPS语法见上方给出的sps语法表实际视频的第2个字节
profile_idc : 43第二个42是指profile,表示profile是66(十进制),即baseline profileH264中的profile与level
profile_idc = 66 —— baslineprofile_idc = 77 —— mainprofile_idc = 88 —— extendprofile_idc = 100 —— high
实际视频数据的第三个字节
constraint_set0_flag~constraint_set5_flag给当前帧加一些限制性条件level_idc实际视频数据的第四个字节
level_idc : 31当前码流中,level对应3.1,即720p,30fps
标识当前码流的Level编码的Level定义了某种条件下的最大视频分辨率、最大视频帧率等参数,码流所遵从的level由level_idc指定。seq_parameter_set_id表示当前的RBSP(序列参数集)的id。通过该id值,图像参数集pps可以引用其代表的sps中的参数。chroma_format_idcchroma_format_idc : 1表示色度采样结构,示例的视频流为yuv420residual_colour_transform_flag
residual_colour_transform_flag = 0值等于1时,应 用 264文档8.5节规定的残余颜色变换 。residual_colour_transform_flag 等于 0 时则不使用残余颜色变换。当 residual_colour_transform_flag 不存在时,默认其值为 0
bit_depth_luma_minus8
bit_depth_luma_minus8 = 0
是指亮度队列样值的比特深度以及亮度量化参数范围的取值偏移 QpBdOffsetY
BitDepthY = 8 + bit_depth_luma_minus8QpBdOffsetY = 6 * bit_depth_luma_minus8
当 bit_depth_luma_minus8 不存在时,应推定其值为 0。bit_depth_luma_minus8 取值范围应该在 0 到 4 之间(包括 0 和 4)。qpprime_y_zero_transform_bypass_flag
qpprime_y_zero_transform_bypass_flag : 0
当qpprime_y_zero_transform_bypass_flag 没有特别指定时,应推定其值为 0。seq_scaling_matrix_present_flag
seq_scaling_matrix_present_flag : 0
等 于 1 表 示 存 在 i=0…7 的 标 志 seq_scaling_list_present_flag[ i ] 。当seq_scaling_matrix_present_flag 没有特别指定时,应推定其值为 0。log2_max_frame_num_minus4
log2_max_frame_num_minus4 : 6
用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。计算方法为MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)pic_order_cnt_type
pic_order_cnt_type : 2
表示解码picture order count(POC)的方法。POC是另一种计量图像序号的方式,与frame_num有着不同的计算方法。该语法元素的取值为0、1或2log2_max_pic_order_cnt_lsb_minus4
log2_max_pic_order_cnt_lsb_minus4 : 0
用于计算MaxPicOrderCntLsb的值,该值表示POC的上限。计算方法为MaxPicOrderCntLsb = 2^(log2_max_pic_order_cnt_lsb_minus4 + 4)num_ref_frames规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考场对以及不成对的参考场的最大数量。pic_width_in_mbs_minus1
pic_width_in_mbs_minus1 : 79
加 1 是指以宏块为单元的每个解码图像的宽度。PicWidthInMbs = pic_width_in_mbs_minus1 + 116是h264中的宏块边长于是示例视频流中的图像宽度为80 x 16 = 1280pic_height_in_map_units_minus1
pic_height_in_map_units_minus1 : 44
使用PicHeightInMapUnits来度量视频中一帧图像的高度。PicHeightInMapUnits并非图像明确的以像素或宏块为单位的高度,而需要考虑该宏块是帧编码或场编码。PicHeightInMapUnits的计算方式为:PicHeightInMapUnits = pic_height_in_map_units_minus1 + 116是h264中的宏块边长于是示例视频流中的图像宽度为45 x 16 = 7202)PPS分析分析同SPS3)GOP分析GOP(Group of Pictures,图像组)是将一个图像序列中连续的几个图像组成的一个小组,是对编码后的视频码流进行编辑、存取和压缩编码的基本单元,包含不同种类编码的帧。增大GOP或提高GOP中P/B帧的占比,可以提高压缩比,降低码率。因此一般而言,在码率一定的条件下,GOP越大,图像质量越好(P/B帧的比重更大);在图像质量一定的条件下,GOP越大,码率越低。
红色:I帧蓝色:P帧绿色:B帧
显示帧比特数的平均值,从图中就可看出,相对来说 B 帧要比 I 帧和 P 帧占用更小的比特数。将此视频序列的帧信息存入csv文件中,可看到码流顺序的帧排序I帧(帧内预测帧)所有宏块全部为 I 类型宏块,且其中有16×16宏块、8×8宏块和4×4宏块P帧(前向预测帧)P帧中宏块大部分为 P 类型宏块,且P类型宏块中16×16类型最多。原因应在于前后图像的变化不大,同时存在帧内编码宏块以弥补此帧相对于之前的 I 帧差异较大的细节部分。B帧(双向预测帧)I 类型宏块仍然存在,大部分为B帧的宏块SPS 用于存放视频信息,图像profile、level、chroma、图像长宽等关键信息I帧越大,P帧越小;I帧越小P帧越大I帧大小取决于图像本身内容,和压缩算法的空间部分P帧的大小取决于图像变化的剧烈程度码率的概念就是,沿着时间轴,这些帧的大小。如果每个P帧的大小相差过大,那么网络传输就会很麻烦,带宽可能不够或者闲置图像变化是否剧烈,是选择码率控制模式的依据之一参考文章:[1] https://blog.csdn.net/BIN_markie/article/details/125453536

我要回帖

更多关于 数据压缩的基本类型 的文章