oracle 压缩 方式6,Oracle数据压缩

依赖于不同的版本,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 (

column1NUMBERNOT NULL ,

column2NUMBERNOT NULL ,

column3NUMBERNOT NULL ,

column4NUMBER ,

column5NUMBER )

/

然后在表上创建一个唯一索引,使用COMPRESS声明压缩键:

CREATE UNIQUE INDEX test_idx1ON test_table(column1,column2,column3) COMPRESS

/

前缀键将在column1和column2上创建,也可以声明压缩的列数:

CREATE UNIQUE INDEX test_idx1ON 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(col1NUMBERNOT NULL

3,col2VARCHAR2(128)NOT NULL

4,col3DATENULL)

5NOCOMPRESS -- default but state it for clarity

6/

Table created.

SQL> CREATE TABLE temp_compressed_direct

2(col1NUMBERNOT NULL

3,col2VARCHAR2(128)NOT NULL

4,col3DATENULL)

5COMPRESS FOR DIRECT_LOAD OPERATIONS

6/

Table created.

SQL> CREATE TABLE temp_compressed_all

2(col1NUMBERNOT NULL

3,col2VARCHAR2(128)NOT NULL

4,col3DATENULL)

5COMPRESS FOR ALL OPERATIONS

6/

Table created.

SQL> SELECT table_name

2,compression

3,compress_for

4,pct_free

5FROMuser_tables

6WHEREtable_name IN('TEMP_UNCOMPRESSED','TEMP_COMPRESSED_ALL','TEMP_COMPRESSED_DIRECT')

7/

TABLE_NAMECOMPRESS COMPRESS_FORPCT_FREE

------------------------------ -------- ------------------ ----------

TEMP_COMPRESSED_ALLENABLEDFOR ALL OPERATIONS10

TEMP_COMPRESSED_DIRECTENABLEDDIRECT LOAD ONLY0

TEMP_UNCOMPRESSEDDISABLED10

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(

column1NUMBERNOT NULL,

column2NUMBERNOT NULL,

column3NUMBER)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值