Oracle中的表压缩和索引压缩

0    291    1

Tags:

👉 本文共约5452个字,系统预计阅读时间或需21分钟。

从Oracle9iR2 开始,ORACLE提供了表/表空间压缩技术,以减少磁盘开销,节省空间,并在某些情况下提高查询性能。

简介

随着数据库规模的不断增大,磁盘空间成为大型企业数据库管理的一个重要问题。Oracle提供了压缩表的功能来帮助释放磁盘空间,使企业更有效地管理其数据库。

Oracle表压缩功能很容易使用且非常有效,它可以帮助企业节省数据库存储空间和硬件成本,并提高数据库性能。

在压缩表之前,要确保备份数据,并在压缩非繁忙时间段进行操作,以避免影响正常业务。

此外,压缩表联机重建功能应该启用以确保在查询时自动解压缩数据块。

Oracle支持在表空间(tablespace)、数据表(table)和分区(Partition)级别的压缩,如果设置为表空间级别,那么默认将该表空间中的全部的表都进行压缩。
压缩操作可以在数据单条插入、数据修改和数据批量导入时发生。

随着数据库不断增长,可以考虑使用表压缩。压缩可以节省磁盘空间,减少数据库buffer cache内存使用,并且可以加速查询。

压缩对于数据装载和DML操作有一定的CPU消耗。然而,这些消耗可以为I/O的减少而抵消。

表压缩对于应用程序完全透明。对于DSS系统、在线事务处理和归档系统都很有用处。

你可以为表空间,表或者一个分区指定压缩。如果指定为表空间压缩,那么该表空间所有表创建后默认都启用压缩。

什么是Oracle压缩表?

Oracle压缩表是一种称为OLTP压缩(OLTP Compression)的压缩模型,它可以大大减少磁盘空间的使用,从而提高数据库的性能。这种压缩模式不会影响查询速度,因为Oracle会自动解压缩数据块,并在查询之前将其发送到缓存中。在压缩表中,相同数据类型的值被存储在一起,并使用更少的字节数来表示它们。

Oracle压缩表的好处

使用Oracle表压缩功能有以下好处:

  1. 减少磁盘使用:压缩表可以减少磁盘使用,从而减少数据库的存储成本。

  2. 提高性能:由于表中的数据较少,查询时间会更短,从而提高Oracle数据库的性能。

  3. 增加可存储数据:由于使用的物理存储空间较小,可以增加可以存储的数据量。

压缩类型

在Oracle数据库中,压缩表的命令是ALTER TABLE语句与COMPRESS选项的结合。

Oracle提供了一下四种类型的表压缩方法:

1、Basic Compression:压缩等级High,CPU开销较小

2、OLTP Compression:压缩等级High,CPU开销较小

3、Warehouse Compression:压缩等级Higher,CPU开销较大(取决于压缩参数是Low还是High)

4、Archive Compression:压缩等级Highest,CPU开销很大(取决于压缩参数是Low还是High)

当使用Basic Compression,warehouse Compression,Archive Compression类型的压缩时,尽在发生批量数据导入时才会执行压缩。

OLTP Compression被用于联机事务处理系统,可以对任意的SQL操作执行数据压缩。

Warehouse Compression和Archive Compression可以获得很高的压缩等级,因为它们采用了Hybrid Columnar(混合列)压缩技术,Hybrid Columnar采用一种改良的列的存储形式替代一行为主的存储形式。Hybird Columnar技术允许将相同的数据存储在一起,提高了压缩算法的效率。当使用混合列压缩算法时,将导致更多的CPU开销,因此这种压缩技术适用于更新不频繁的数据。

basic 和 OLTP 压缩

image.png

  • 使用 basic 压缩时,压缩仅在批量加载数据到表中时才会发生(仅直接路径加载的数据才会被压缩)
  • 使用 OLTP 压缩时,数据被插入,更新或批量加载到表中时发生压缩。允许压缩的操作包括:
  • 单行或数组插入和更新
  • 插入和更新不会立即压缩
  • 更新一个已经压缩的块时,未被更新的列仍然保持压缩状态,被更新的列以未压缩的格式存储。当块达到数据库控制的阈值时,更新的值将被重新压缩
  • 当数据块中的数据达到数据库控制的阈值时,插入的数据也被压缩
  • 直接路径INSERT方法:

  • basic 仅压缩通过直接路径加载插入的数据,并支持有限的数据类型和 SQL 操作;OLTP 压缩旨在用于 OLTP应用程序,可以压缩由任何 SQL 操作操纵的数据
  • 对于 basic 和 OLTP 压缩来说,压缩块上的 DELETE 操作都与非压缩块上的 DELETE 操作相同。由 DELETE 操作所获得的任何空间都会被后续的 INSERT 操作重用
  • 使用 CREATE TABLE 语句的 COMPRESS 子句指定表压缩,也可以通过在 ALTER TABLE 语句中使用这些子句来为现有表启用压缩,在这种情况下,只有启用压缩后插入或更新的数据才被压缩。同样,也可以使用 ALTER TABLE... NOCOMPRESS 语句禁用表压缩,在这种情况下,所有已压缩的数据都将保持压缩状态,并且新数据将被无压缩地插入

示例

下面是使用压缩表的命令示例:

基本压缩(Basic Compression):

高级压缩(Advanced Compression):

或者,您可以选择使用不同的高级压缩选项,例如基于列的压缩(COMPRESS FOR QUERY LOW)、基于行的压缩(COMPRESS FOR ARCHIVE LOW)或基于位图的压缩(COMPRESS FOR OLTP):

其中,<compression_option>可以是以下选项之一:QUERY LOW, QUERY HIGH, ARCHIVE LOW, ARCHIVE HIGH, ARCHIVE ALL, OLTP.

  • 1)在 orders 表上启用 OLTP 表压缩,表中的数据在直接路径INSERT和 常规 DML 期间都会被压缩

  • 2)在 sales_history 表上启用基本表压缩

  • 3)使用直接路径插入将行插入到表中

Adding and Dropping Columns in Compressed Tables

  • 向压缩表添加列时,以下限制适用:
  • basic 压缩:不能为新加列指定默认值
  • OLTP 压缩:如果为新加列指定了默认值,则该列必须为 NOT NULL;不支持添加有默认值的可空列
  • 在压缩表中删除列时,下列限制适用:
  • basic 压缩:不支持删除列
  • OLTP压缩:支持 DROP COLUMN,但在内部,数据库将列设置为 UNUSED 以避免长时间运行的解压缩和重压缩操作

压缩与分区

  • 一个表可以有压缩和未压缩的分区,不同的分区可以使用不同的压缩方法

  • 如果表和某个分区的压缩设置不匹配,则分区上指定的压缩级别的优先级高

  • 要更改分区的压缩方法,请执行以下操作之一:

    • 若仅对新数据更改压缩方法,使用 ALTER TABLE ... MODIFY PARTITION. .. COMPRESS ...
    • 若对新数据和现有数据都更改压缩方法,使用 ALTER TABLE ... MOVE PARTITION ... COMPRESS ... 或 在线表重定义

开启压缩

如何在建表时开启压缩功能

在建表时可以执行以下命令:

  “compress for all operations”子句在所有 DML 活动(如 INSERT、UPDATE 等)上执行压缩。压缩在所有 DML 活动上发生,而不像前几个版本那样,只在直接路径插入上发生。

表空间级别

与其他存储参数类似,COMPRESS属性也具有一些继承特性。当在一个表空间中创建一个表时,它从该表空间继承COMPRESS属性。

使现有表空间转换为压缩表空间:

确定是否已经利用compress对一个表空间进行了定义,可查询user_tablespaces数据字典视图并查看def_tab_compression列

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
AiDBA后续精彩内容已被站长无情隐藏,请输入验证码解锁本文!
验证码:
获取验证码: 请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“AiDBA”或者“dbaup6”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复