11g和12c都有这个问题:
SQL> select index_name
from user_indexes where table_name='TEST_RP';
INDEX_NAME
------------------------------
IDX_DATE_ID
SQL> select
index_name,PARTITION_NAME,COMPRESSION from user_ind_partitions
where index_name='IDX_DATE_ID';
INDEX_NAME PARTITION_NAME COMPRESS
------------------------------
------------------------------ --------
IDX_DATE_ID
P201505 DISABLED
IDX_DATE_ID
P201506 DISABLED
IDX_DATE_ID
P201507 DISABLED
IDX_DATE_ID
P201508 DISABLED
IDX_DATE_ID
P201509 DISABLED
IDX_DATE_ID
P201510 DISABLED
已选择6行。
SQL> select
sum(bytes)/1024/1024 from user_segments where
segment_name='IDX_DATE_ID';
SUM(BYTES)/1024/1024
--------------------
.0625
SQL> select
sum(bytes)/1024 from user_segments where
segment_name='IDX_DATE_ID';
SUM(BYTES)/1024
---------------
64
SQL> alter index
IDX_DATE_ID rebuild compress;
alter index IDX_DATE_ID
rebuild compress
*
第 1 行出现错误:
ORA-14086:
不能将分区索引作为整体重建
SQL> alter index
IDX_DATE_ID rebuild partition P201505 compress;
alter index IDX_DATE_ID
rebuild partition P201505 compress
*
第 1 行出现错误:
ORA-28659: 必须首先在对象级指定
COMPRESS
SQL> alter index
IDX_DATE_ID rebuild compress partition P201505;
alter index IDX_DATE_ID
rebuild compress partition P201505
*
第 1 行出现错误:
ORA-02243: ALTER INDEX 或
ALTER MATERIALIZED VIEW 选项无效
SQL>
SQL> drop index
IDX_DATE_ID;
索引已删除。
SQL> create index
IDX_DATE_ID on test_rp(date_id) local compress;
索引已创建。
SQL> select
sum(bytes)/1024/1024 from user_segments where
segment_name='IDX_DATE_ID';
SUM(BYTES)/1024/1024
--------------------
10.0625
SQL> select
index_name,PARTITION_NAME,COMPRESSION from user_ind_partitions
where index_name='IDX_DATE_ID';
INDEX_NAME PARTITION_NAME COMPRESS
------------------------------
------------------------------ --------
IDX_DATE_ID
P201505 ENABLED
IDX_DATE_ID
P201506 ENABLED
IDX_DATE_ID
P201507 ENABLED
IDX_DATE_ID
P201508 ENABLED
IDX_DATE_ID
P201509 ENABLED
IDX_DATE_ID
P201510 ENABLED
已选择6行。
SQL> alter index
IDX_DATE_ID rebuild partition P201510 nocompress;
索引已更改。
SQL> select
index_name,PARTITION_NAME,COMPRESSION from user_ind_partitions
where index_name='IDX_DATE_ID';
INDEX_NAME PARTITION_NAME COMPRESS
------------------------------
------------------------------ --------
IDX_DATE_ID
P201505 ENABLED
IDX_DATE_ID
P201506 ENABLED
IDX_DATE_ID
P201507 ENABLED
IDX_DATE_ID
P201508 ENABLED
IDX_DATE_ID
P201509 ENABLED
IDX_DATE_ID
P201510 DISABLED
已选择6行。
SQL> alter index
IDX_DATE_ID rebuild partition P201510 compress;
索引已更改。
SQL> select
index_name,PARTITION_NAME,COMPRESSION from user_ind_partitions
where index_name='IDX_DATE_ID';
INDEX_NAME PARTITION_NAME COMPRESS
------------------------------
------------------------------ --------
IDX_DATE_ID
P201505 ENABLED
IDX_DATE_ID
P201506 ENABLED
IDX_DATE_ID
P201507 ENABLED
IDX_DATE_ID
P201508 ENABLED
IDX_DATE_ID
P201509 ENABLED
IDX_DATE_ID
P201510 ENABLED
已选择6行。
SQL>
打算把老数据的索引给压缩下,结果做不了,报ORA-28659
SQL> DROP TABLE test_partition;
Table dropped
SQL> SQL> CREATE TABLE test_partition
2 ( ID NUMBER,NAME
VARCHAR2(200)
3 )
4 PARTITION BY RANGE
(ID)
5 (PARTITION test01 VALUES
LESS THAN (100),
6 PARTITION test02 VALUES LESS
THAN (200),
7 PARTITION test03 VALUES LESS
THAN (300),
8 PARTITION test04 VALUES LESS
THAN (MAXVALUE))
9 /
Table created
SQL> CREATE INDEX idx_test_PARTITION on test_partition (ID)
local;
Index created
SQL> alter index idx_test_PARTITION rebuild partition test01
compress;
alter index idx_test_PARTITION rebuild partition test01
compress
ORA-28659: COMPRESS must be specified at object level first
解决方法也很奇怪,先建立compress的local索引,再把不需要compress的分区给nocompress
SQL> drop index idx_test_PARTITION;
Index dropped
SQL> CREATE INDEX idx_test_PARTITION on test_partition (ID)
LOCAL COMPRESS;
Index created
SQL> SQL> alter index idx_test_PARTITION rebuild partition test04
nocompress;
Index altered
SQL> alter index idx_test_PARTITION rebuild partition test02
nocompress;
Index altered
SQL> alter index idx_test_PARTITION rebuild partition test03
nocompress;
Index altered
但是,这个时候,如果想把个别分区给compress是可以的:
SQL> alter index idx_test_PARTITION rebuild partition test02
compress;
Index altered
估计一个分区索引的个别分区能否compress是和对象级别的能否compress相关的
表的分区能独立的compress