新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2008-01-06 21:34:48
依赖于不同的版本,Oracle一共提供了三种类型的压缩形式:
表压缩;OLTP表压缩;键压缩;
表压缩从10g Release 1中引入,可以在堆表上进行压缩。同时在堆表分区和物化事务上也存在。在11g Release 1中,Oracle引入了OLTP表压缩,该特征允许在OLTP环境下进行使用。
键压缩从8i Release 1引入,可以用来压缩索引数据或者索引组织表。
虽然实施方式不同,但是它们都使用相同的本质,在块头存储重复的值。
使用这些形式的压缩可以大大的减少存储,并且可以潜在的减少I/O的数量,但是会消耗额外的CPU,因为解压这些数据需要CPU。
键压缩
什么是键压缩?
键压缩允许一个组合索引中的列的重复值存储在一个小的符号表中,其在块头中。
该替代会极大的节约存储空间,并且通过减少I/O提高性能。
键压缩如何工作?
B数索引通常在其键中产生两个片,其中一个前缀列,一个后缀列(标识列)。
如果索引是不唯一的,Oracle将自动的加rowid到列索引的结尾,ROWID用来组成唯一片。
默认情况下,前缀列由全部的列-最后的列组成,对于非唯一索引,前缀列为全部列。
CREATE TABLE test_table (
column1 NUMBER NOT NULL ,
column2 NUMBER NOT NULL ,
column3 NUMBER NOT NULL ,
column4 NUMBER ,
column5 NUMBER )
/
然后在表上创建一个唯一索引,使用COMPRESS声明压缩键:
CREATE UNIQUE INDEX test_idx1 ON test_table(column1,column2,column3) COMPRESS
/
前缀键将在column1和column2上创建,也可以声明压缩的列数:
CREATE UNIQUE INDEX test_idx1 ON test_table(column1,column2,column3) COMPRESS 1
/
键压缩有用的地方?
B Tree索引和IOT表能够获益,位图索引以一种特定的形式压缩,但不是键压缩。键压缩仅在多个列,如复合索引,或者只有一个列的非唯一索引上获益,唯一索引则不能获得任何好处,相反,Oracle不允许在这种索引上压缩。
SQL> CREATE TABLE test_table
2 (column1 NUMBER NOT NULL
3 ,column2 NUMBER NOT NULL
4 ,column3 NUMBER NOT NULL
5 ,column4 NUMBER
6 ,column5 NUMBER
7 )
8 /
Table created.
SQL> CREATE UNIQUE INDEX test_idx1 ON test_table(column1)
2 COMPRESS
3 /
compress
*
ERROR at line 2:
ORA-25193: cannot use COMPRESS option for a single column key
键压缩的好处和坏处?
键压缩的好处:
·节约页块空间;
·透明实施;
·通过减少I/O提高性能。
但是需要考虑的是会增加CPU时间。
OLTP表压缩
OLTP表压缩从Oracle 11g Release 1引入,使企业版的特征。不同的是OLTP表压缩主要用于非直接路径操作在后台执行,Oracle以一种方法实施,以批操作的模式进行,以确保最小化性能的影响。
可以查看如下:
SQL> CREATE TABLE temp_uncompressed
2 (col1 NUMBER NOT NULL
3 ,col2 VARCHAR2(128) NOT NULL
4 ,col3 DATE NULL)
5 NOCOMPRESS -- default but state it for clarity
6 /
Table created.
SQL> CREATE TABLE temp_compressed_direct
2 (col1 NUMBER NOT NULL
3 ,col2 VARCHAR2(128) NOT NULL
4 ,col3 DATE NULL)
5 COMPRESS FOR DIRECT_LOAD OPERATIONS
6 /
Table created.
SQL> CREATE TABLE temp_compressed_all
2 (col1 NUMBER NOT NULL
3 ,col2 VARCHAR2(128) NOT NULL
4 ,col3 DATE NULL)
5 COMPRESS FOR ALL OPERATIONS
6 /
Table created.
SQL> SELECT table_name
2 , compression
3 , compress_for
4 , pct_free
5 FROM user_tables
6 WHERE table_name IN('TEMP_UNCOMPRESSED','TEMP_COMPRESSED_ALL','TEMP_COMPRESSED_DIRECT')
7 /
TABLE_NAME COMPRESS COMPRESS_FOR PCT_FREE
------------------------------ -------- ------------------ ----------
TEMP_COMPRESSED_ALL ENABLED FOR ALL OPERATIONS 10
TEMP_COMPRESSED_DIRECT ENABLED DIRECT LOAD ONLY 0
TEMP_UNCOMPRESSED DISABLED 10
OLTP压缩表可以通过TEMP_COMPRESSED_ALL查询到。
表压缩
表压缩可以使用的地方?
可以使用表压缩的对象包括:
·堆表;
·潜逃表;
·范围或列表分区;
·物化视图;
不能使用压缩的对象:
·子分区;
·哈希分区;
·外部表;
·聚簇表的一部分;
·带LOBS的表;
·IOTs表;
·索引;
影响压缩率的因素?
实际使用的算法Oracle并没有透露,不过主要因素包括:
·块大小;
·块负载;
·重复值;
·重复值的列长度,需要注意,如果列值长度小于6,那么压缩将被忽略;
·接合数据提高重复数据相邻的角度;
表压缩的好处和缺点?
表压缩的好处:
·节约空间;
·减少IO;
·透明;
·提高某些DML的性能—删除更快,某些插入更快;
缺点:
·CPU负载增加;
·在10g中仅在直接路径加载中可用;
·会降低某些DML的性能—更新和某些插入;
平衡
不允许删除一个列,如果试图删除将会得到ORA-39726错误,但是如果使用ALTER TABLE test_table MOVE NOCOMPRESS将表转换为非压缩的则可以(至少在10.2中可以)。
CREATE TABLE test_table(
column1 NUMBER NOT NULL,
column2 NUMBER NOT NULL,
column3 NUMBER )
COMPRESS
/
INSERT /*+ APPEND */
INTO test_table
(column1, column2, column3)
SELECT MOD(l, 1000), MOD(l, 100), 1
FROM (select level l from dual connect by level < 100001)
SQL> ALTER TABLE test_table DROP COLUMN column3
2 /
ALTER TABLE test_table DROP COLUMN column3
*
ERROR at line 1:
ORA-39726: unsupported add/drop column operation on compressed tables
SQL> ALTER TABLE test_table MOVE NOCOMPRESS
2 /
Table altered.
ALTER TABLE test_table DROP COLUMN column3;
Table altered
SQL> ALTER TABLE test_table DROP COLUMN column2;
Table altered