姓名:杨宝秋,OCM,ACE。近8年的TB级数据库设计、建设、管理、运行维护、调优经验,也做了7年的Hp和IBM Rs6000的系统管理员,而且是获得了BCFP认证的SAN管理员,现为中国联通黑龙江分公司数据库主管。

ORACLE的数据段压缩技术 part4

上一篇 / 下一篇  2008-02-21 11:28:44 / 个人分类:Oracle

5如何使用段压缩

5.1创建一张压缩表,后续直接装载插入的数据会被压缩

语法:

CREATE TABLE <table_name> ... COMPRESS;

eg

SQL> create table T1 (col number) compress

  2 /

Table created.

5.2压缩已有一张非分区表

Alter table <table_name> compress只对表后续的数据有效,并无压缩原有的数据,压缩原有的数据需要执行move compress操作。

语法:

ALTER TABLE <table_name> move … COMPRESS;

eg 

SQL> alter table T1 move compress;

Table altered.

5.3压缩一张已有的分区表

Scott下有一张分区表,创建脚本如下:

SQL>CREATETABLErange_sales

(

 prod_id       NUMBER(6),

 cust_id       NUMBER,

 time_id       DATE

)

PARTITIONBYRANGE(time_id)

(

 PARTITIONSALES_Q1_2007VALUESLESSTHAN(TO_DATE('01-APR-2007','DD-MON-YYYY')),

 PARTITIONSALES_Q2_2007VALUESLESSTHAN(TO_DATE('01-JUL-2007','DD-MON-YYYY')),

 PARTITIONSALES_Q3_2007VALUESLESSTHAN(TO_DATE('01-OCT-2007','DD-MON-YYYY')),

 PARTITIONSALES_Q4_2007VALUESLESSTHAN(TO_DATE('01-JAN-2008','DD-MON-YYYY'))

)

;

-- Create/Recreate indexes

createindexIDX_RANGE_SALES_PROD_IDonRANGE_SALES (PROD_ID)LOCAL;

分区表是不能整表做move compress操作的,需要一个分区一个分区的做。

分区表整表压缩会报错:

SQL> alter table range_sales move compress;

alter table range_sales move compress

           *

ERROR at line 1:

ORA-14511: cannot perform. operation on a partitioned object

可以单个分区做move compress操作,做move compress后因rowid发生了改变,需要把索引rebuild一下。

SQL> alter table range_sales move partition SALES_Q1_2007 compress;

Table altered.

查看一下索引的状态

SQL> SELECT index_name,partition_name,status FROM User_Ind_Partitions WHERE status=’ UNUSABLE’;

 

INDEX_NAME               PARTITION_NAME STATUS

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

IDX_RANGE_SALES_PROD_ID  SALES_Q1_2007  UNUSABLE

 

SQL>

Rebuild一下UNUSABLE状态的索引

SQL> alter index IDX_RANGE_SALES_PROD_ID rebuild partition SALES_Q1_2007;

 

Index altered.

 

5.4压缩索引段

索引中的数据列重复项比较多的时候,可以考虑进行索引压缩,一般说来复合索引更适合索引压缩,复合索引前辍字段的重复列越多则压缩比越大。

语法:

  --创建

  create index <index_name> on <table_name>(col1,col2 ….coln) compress [n];

  --变更

  Alter index <index_name> rebuild compress [n];

其中n是可选的,即压缩索引的前n列,如果不指定则压缩所有的列。

这里需要特殊说明的是分区索引的压缩,分区索引的单个分区是不能通过rebuild compress方式进行压缩的,需要drop掉整个索引,然后创建时加compress选项。

SQL> alter index IDX_RANGE_SALES_PROD_ID rebuild partition SALES_Q1_2007 compress;

alter index IDX_RANGE_SALES_PROD_ID rebuild partition SALES_Q1_2007 compress

*

ERROR at line 1:

ORA-28659: COMPRESS must be specified at object level first

 

SQL> drop index IDX_RANGE_SALES_PROD_ID;

Index dropped.

 

SQL> create index IDX_RANGE_SALES_PROD_ID on RANGE_SALES (PROD_ID) LOCALCOMPRESS;

Index created.

 


TAG:

引用 删除   /   2008-06-04 16:24:45
重建索引真是帮大忙了,谢谢!
引用 删除   /   2008-06-04 16:24:43
重建索引真是帮大忙了,谢谢!
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2008-07-24  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 5865
  • 日志数: 63
  • 图片数: 1
  • 建立时间: 2008-01-30
  • 更新时间: 2008-06-05

RSS订阅

Open Toolbar