合 Oracle中的表压缩和索引压缩
从Oracle9iR2 开始,ORACLE提供了表/表空间压缩技术,以减少磁盘开销,节省空间,并在某些情况下提高查询性能。
简介
随着数据库规模的不断增大,磁盘空间成为大型企业数据库管理的一个重要问题。Oracle提供了压缩表的功能来帮助释放磁盘空间,使企业更有效地管理其数据库。
Oracle表压缩功能很容易使用且非常有效,它可以帮助企业节省数据库存储空间和硬件成本,并提高数据库性能。
在压缩表之前,要确保备份数据,并在压缩非繁忙时间段进行操作,以避免影响正常业务。
此外,压缩表联机重建功能应该启用以确保在查询时自动解压缩数据块。
Oracle支持在表空间(tablespace)、数据表(table)和分区(Partition)级别的压缩,如果设置为表空间级别,那么默认将该表空间中的全部的表都进行压缩。
压缩操作可以在数据单条插入、数据修改和数据批量导入时发生。
随着数据库不断增长,可以考虑使用表压缩。压缩可以节省磁盘空间,减少数据库buffer cache内存使用,并且可以加速查询。
压缩对于数据装载和DML操作有一定的CPU消耗。然而,这些消耗可以为I/O的减少而抵消。
表压缩对于应用程序完全透明。对于DSS系统、在线事务处理和归档系统都很有用处。
你可以为表空间,表或者一个分区指定压缩。如果指定为表空间压缩,那么该表空间所有表创建后默认都启用压缩。
什么是Oracle压缩表?
Oracle压缩表是一种称为OLTP压缩(OLTP Compression)的压缩模型,它可以大大减少磁盘空间的使用,从而提高数据库的性能。这种压缩模式不会影响查询速度,因为Oracle会自动解压缩数据块,并在查询之前将其发送到缓存中。在压缩表中,相同数据类型的值被存储在一起,并使用更少的字节数来表示它们。
Oracle压缩表的好处
使用Oracle表压缩功能有以下好处:
减少磁盘使用:压缩表可以减少磁盘使用,从而减少数据库的存储成本。
提高性能:由于表中的数据较少,查询时间会更短,从而提高Oracle数据库的性能。
增加可存储数据:由于使用的物理存储空间较小,可以增加可以存储的数据量。
压缩类型
在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 压缩
- 使用 basic 压缩时,压缩仅在批量加载数据到表中时才会发生(仅直接路径加载的数据才会被压缩)
- 使用 OLTP 压缩时,数据被插入,更新或批量加载到表中时发生压缩。允许压缩的操作包括:
- 单行或数组插入和更新
- 插入和更新不会立即压缩
- 更新一个已经压缩的块时,未被更新的列仍然保持压缩状态,被更新的列以未压缩的格式存储。当块达到数据库控制的阈值时,更新的值将被重新压缩
- 当数据块中的数据达到数据库控制的阈值时,插入的数据也被压缩
- 直接路径INSERT方法:
1 2 3 4 | Direct path SQL*Loader CREATE TABLE AS SELECT statements Parallel INSERT statements INSERT statements with an APPEND or APPEND_VALUES hint |
- basic 仅压缩通过直接路径加载插入的数据,并支持有限的数据类型和 SQL 操作;OLTP 压缩旨在用于 OLTP应用程序,可以压缩由任何 SQL 操作操纵的数据
- 对于 basic 和 OLTP 压缩来说,压缩块上的 DELETE 操作都与非压缩块上的 DELETE 操作相同。由 DELETE 操作所获得的任何空间都会被后续的 INSERT 操作重用
- 使用 CREATE TABLE 语句的 COMPRESS 子句指定表压缩,也可以通过在 ALTER TABLE 语句中使用这些子句来为现有表启用压缩,在这种情况下,只有启用压缩后插入或更新的数据才被压缩。同样,也可以使用
ALTER TABLE... NOCOMPRESS
语句禁用表压缩,在这种情况下,所有已压缩的数据都将保持压缩状态,并且新数据将被无压缩地插入
示例
下面是使用压缩表的命令示例:
基本压缩(Basic Compression):
1 | ALTER TABLE table_name COMPRESS; |
高级压缩(Advanced Compression):
1 | ALTER TABLE table_name COMPRESS FOR ALL OPERATIONS; |
或者,您可以选择使用不同的高级压缩选项,例如基于列的压缩(COMPRESS FOR QUERY LOW
)、基于行的压缩(COMPRESS FOR ARCHIVE LOW
)或基于位图的压缩(COMPRESS FOR OLTP
):
1 | ALTER TABLE table_name COMPRESS FOR <compression_option>; |
其中,<compression_option>
可以是以下选项之一:QUERY LOW
, QUERY HIGH
, ARCHIVE LOW
, ARCHIVE HIGH
, ARCHIVE ALL
, OLTP
.
- 1)在 orders 表上启用 OLTP 表压缩,表中的数据在直接路径INSERT和 常规 DML 期间都会被压缩
1 | CREATE TABLE orders ... COMPRESS FOR OLTP; |
- 2)在 sales_history 表上启用基本表压缩
1 2 3 | CREATE TABLE sales_history ... COMPRESS BASIC; CREATE TABLE sales_history ... COMPRESS; |
- 3)使用直接路径插入将行插入到表中
1 2 | INSERT /*+ APPEND */ INTO sales_history SELECT * FROM sales WHERE cust_id=8890; COMMIT; |
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 ...
或 在线表重定义
- 若仅对新数据更改压缩方法,使用
开启压缩
如何在建表时开启压缩功能
在建表时可以执行以下命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | create table my_compressed_table ( col1 number(20), col2 varchar2(300), ...) compress for all operations; -- 建立普通表 create table table1 ( ...... ) compress; -- 建立分区表 create table table1 ( ... ) compress partition by range(...) ( partition part_1 values less than(...) compress, partition part_2 values less than(...) compress, ... ) |
“compress for all operations”子句在所有 DML 活动(如 INSERT、UPDATE 等)上执行压缩。压缩在所有 DML 活动上发生,而不像前几个版本那样,只在直接路径插入上发生。
表空间级别
1 | create tablespace TEST datafile '/export/home/oracle/ora10g/oradata/test/test.dbf' size 10M default compress; |
与其他存储参数类似,COMPRESS属性也具有一些继承特性。当在一个表空间中创建一个表时,它从该表空间继承COMPRESS属性。
使现有表空间转换为压缩表空间:
1 2 | alter tablespace test default compress; alter tablespace test default nocompress; |
确定是否已经利用compress对一个表空间进行了定义,可查询user_tablespaces数据字典视图并查看def_tab_compression列