前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Oracle Concept》第二章 - 14

《Oracle Concept》第二章 - 14

作者头像
bisal
发布2019-03-15 11:31:48
4540
发布2019-03-15 11:31:48
举报

表压缩 数据库能使用表压缩来降低存储空间。压缩技术可以节省磁盘空间,降低数据库buffer cache的内存使用量,在一些场景下,还会提高检索执行的速度。表压缩对数据库应用来说是透明的。

基础和OLTP表压缩

基于数据字典的表压缩为堆表提供了良好的压缩率。Oracle数据库支持以下几种基于数据字典的表压缩类型。

1. 基础表压缩

这种类型的压缩适用于批量加载的操作。数据库不会压缩使用传统DML修改的数据。你必须使用直接路径加载,ALTER TABLE ... MOVE操作,或者在线重定义来实现基础压缩。

2. OLTP表压缩

这种类型的压缩适用于OLTP应用,任何SQL操作都能控制压缩数据。

对于基础和OLTP表压缩,数据库会以行格式存储压缩的行。一行的所有列会存储在一起,紧接着是下一行的所有列,如图所示,

640?wx_fmt=png
640?wx_fmt=png

重复的值会在数据块的开始用一个短小的指向表的引用所替代。因此,解压缩数据所需的信息会存储在数据块当中。

压缩的数据块更像是普通的数据块。大多能应用在数据块的数据库特性和功能同样能应用在压缩数据块。

可以在表空间、表、分区或子分区层面指定压缩。如果在表空间上指定压缩,那么在表空间中创建的所有表都会默认采用压缩。

下面语句会在orders表上应用OLTP压缩:

640?wx_fmt=png
640?wx_fmt=png

下面的示例,是在CREATE TABLE语句中为一个分区指定OLTP压缩,为其他分区指定基础压缩:

640?wx_fmt=png
640?wx_fmt=png

参考:

"Data Block Compression"章节,了解关于压缩数据块的格式。

《Oracle Database Administrator's Guide》和《Oracle Database Performance Tuning Guide》了解关于表压缩的信息。

"SQL*Loader"章节了解使用SQL*Loader用于直接路径加载的操作。

混合列压缩

混合列压缩,数据库会为一组行存储相同的列。数据块不会以行格式存储数据,但会使用行和列的混合模式进行存储。

将相同数据类型和相近特征的列数据存储在一起,通过这种压缩能极大提升磁盘节省的空间。即使压缩级别比直接路径加载还要高,任何SQL操作都能控制压缩的数据。数据库对压缩对象的操作都是透明的,因此不需要应用做任何改动。

混合列压缩的类型

如果你的底层存储支持混合列压缩,根据需求,你就能指定如下的压缩类型。

1. 数据仓库压缩

这种类型的压缩为节省磁盘空间做了优化,适用于数据仓库的应用。

2. 在线归档压缩

这种类型的压缩是最大比例的压缩级别,适用于历史数据以及不会改动的数据。

使用数据仓库或者在线归档压缩,必须使用直接路径加载,ALTER TABLE ... MOVE操作,或者在线重定义。

混合列压缩为Exadata一体机存储上的数据仓库以及决策支持系统做了优化。Exadata最大化了使用混合列压缩的表检索性能,充分利用了集成到Exadata存储服务器上的处理器、内存和高速网络带宽。

其他的Oracle存储系统支持混合列压缩,能节省和Exadata存储相同的磁盘空间,但是不能提供相同级别的检索性能。对于这些存储系统来说,混合列压缩适用于数据库内部不经常访问的旧数据归档。

压缩单元

混合列压缩使用叫做压缩单元的逻辑结构存储一组行。当你将数据加载到表中,数据库会以列格式存储一组行,包括每个存储和压缩在一起的列。在数据库压缩了行列数据后,数据库会将数据放入相应的压缩单元中。

例如,你对一张daily_sales表应用了混合列压缩。每天晚上,会向表中导入销售数据,包括商品ID和日期组成的复合主键。下表展示了daily_sales的一些行数据,

640?wx_fmt=png
640?wx_fmt=png

假设上表中的行存储在一个压缩单元。混合列压缩会将每个列值存储在一起,然后使用多个算法来压缩每一列。数据库会基于很多因素选择算法,包括列的数据类型,列中实际值的势,以及用户选择的压缩级别。

如下面的图展示,每个压缩单元能跨越多个数据块。一个特定列的值,可能跨越多个数据块,当然也可能不会跨越多个数据块。

640?wx_fmt=png
640?wx_fmt=png

混合列压缩会有隐式行锁(参考"Row Locks (TX)"章节)。当更新一个非压缩的数据块时,仅会锁定这些更新的行。比较而言,如果更新压缩单元中任意的行,数据块必须锁定压缩单元中所有的行。使用混合压缩列的更新行操作会改变rowid。

注意:

当使用混合列压缩的表,Oracle的DML会锁定更多的数据块(压缩单元),就会降低并发。

参考:

《Oracle Database Licensing Information》了解使用混合列压缩的许可。

《Oracle Database Administrator's Guide》了解如何使用混合列压缩。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档