专栏首页bisal的个人杂货铺《Oracle Concept》第二章 - 14

《Oracle Concept》第二章 - 14

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

基础和OLTP表压缩

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

1. 基础表压缩

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

2. OLTP表压缩

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

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

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

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

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

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

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

参考:

"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的一些行数据,

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

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

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

注意:

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

参考:

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • NLS_LENGTH_SEMANTICS参数引申的问题

    由于某项目的特殊性,开发数据库环境有两套,两边都可能对表结构进行一些修改,因此写了一个工具,比对两边的结构元数据,其中碰到一个问题,很细微,但确实值得注意,在此...

    bisal
  • 使用dbms_stat采集统计信息时estimate_percent和cascade的默认值

    收集统计信息可以用dbms_stats包,通常用这样的语法:exec dbms_stat.gather_table_stats(ownname=>'xxx', ...

    bisal
  • DDL_LOCK_TIMEOUT的作用

    11g的DDL_LOCK_TIMEOUT参数的作用,从字面上看,就是DDL获取锁的超时时间。

    bisal
  • SQL Server 2008 压缩

    执行SQL查询时,主要的几个瓶颈在于:CPU运算速度、内存缓存区大小、磁盘IO速度。而对于大数据量数据的查询,其瓶颈则一般集中于磁盘IO,以及内存缓存。那么为了...

    张善友
  • MySQL 压缩解决方案(一)

    本文描述 mysql 压缩的使用场景和解决方案,包括压缩传输协议、压缩列解决方案和压缩表解决方案。

    飞鸿无痕
  • Hadoop 数据压缩简介

    文件压缩带来两大好处:它减少了存储文件所需的空间,并加速了数据在网络或者磁盘上的传输速度。在处理大量数据时,这两项节省可能非常重要,因此需要仔细考虑如何在 Ha...

    smartsi
  • 优化SqlServer--数据压缩

     数据压缩是对存储和性能优势的加强。减少数据库占用的磁盘空间量将减少整体数据文件存储空间,在一下几个方面增加吞吐量:      1.更好的I/O利用率,每个页面...

    用户1217611
  • Oracle压缩黑科技(三):OLTP压缩

    原文链接:https://www.red-gate.com/simple-talk/sql/oracle/compression-in-oracle-part-...

    沃趣科技
  • InnoDB 列压缩,提升 DB 性能

    十年来腾讯游戏致力于带给玩家最好的快乐体验,腾讯游戏的后台数据库一直守护着亿万玩家的数据,提供稳定透明的服务。 腾讯后台数据库大部分使用的是MySQL数据库,现...

    腾讯大讲堂
  • asp.net core 系列之Performance的 Response compression(响应压缩)

    本文,帮助了解响应压缩的一些知识及用法(大部分翻译于官网,英文水平有限,不准确之处,欢迎指正)。

    Vincent-yuan

扫码关注云+社区

领取腾讯云代金券