oracle 有全局索引怎么删除分区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 有全局索引怎么删除分区相关的知识,希望对你有一定的参考价值。

参考技术A 全局索引删分区后需要重建索引,本地索引不需要 参考技术B ALTER INDEX index DROP PARTITION partition 参考技术C ALTER TABLE DROP PARTITION
用于删除table中某个PARTITION和其中的数据,主要是用于历史数据的删除。如果还想保留数据,就需要合并到另一个partition中。
删除该partition之后,如果再insert该partition范围内的值,要存放在更高的partition中。如果你删除了最大的partition,就会出错。
删除table partition的同时,删除相应的local index。即使该index是IU状态。
如果table上有global index,且该partition不空,drop partition会使所有的global index 为IU状态。如果不想REBUIL INDEX,可以用SQL语句手工删除数据,然后再DROP PARTITION.
例子:
ALTR ATBEL sales DROP PARTITION dec96;

到底是DROP PARTITION或者是DELETE?
如果GLOBAL INDEX是最重要的,就应该先DELETE 数据再DROP PARTITION。
在下面情况下,手工删除数据的代价比DROP PARTITION要小
- 如果要删除的数据只占整个TABLE的小部分
- 在TABLE中有很多的GLOBAL INDEX。
在下面情况下,手工删除数据的代价比DROP PARTITION要大
- 如果要删除的数据占整个TABLE的绝大部分
- 在TABLE中没有很多的GLOBAL INDEX。
如果在TABLE是父TABLE,有被引用的约束,且PARTITION不空,DROP PARTITION时出错。
如果要删除有数据的PARTITION,应该先删除引用约束。或者先DELETE,然后再DROP PARTITION。
如果TABLE只有一个PARTITON,不能DROP PARTITION,只能DROP TABLE。本回答被提问者和网友采纳

Oracle非分区索引,全局分区索引和本地分区索引。

1.如果按照索引是否分区作为划分依据,Oracle 的索引类型可以分为非分区索引,全局分区索引和本地分区索引。

技术图片

2.创建演示实例

--创建非分区表
create
table test_partition_01( number_1 number, number_2 number, string_1 varchar2(10), string_2 varchar2(20) ); -- 写入数据 insert into test_partition_01(number_1, number_2, string_1, string_2) select dbms_random.random() as number_1, round(dbms_random.value(0, 100000)) as number_2, dbms_random.string(opt => A, len => 1) as String_1, dbms_random.string(opt => p, len => 10) as String_2 from dual connect by rownum < 100000; commit;
--试图创建本地分区索引 报错
CREATE INDEX ix_test_partition_01_1 ON test_partition_01(number_1) local (PARTITION p1, PARTITION p2, PARTITION p3);---ORA-14016 ---创建普通索引 CREATE INDEX ix_test_partition_01_1 ON test_partition_01(number_1); --创建 全局分区索引 CREATE INDEX ix_test_partition_01_2 ON test_partition_01(number_2) GLOBAL PARTITION BY RANGE (number_2) (PARTITION p1 VALUES LESS THAN (10000), PARTITION p2 VALUES LESS THAN (55000), PARTITION p3 VALUES LESS THAN (MAXVALUE)); 结论:非分区表可以创建普通索引和全局分区索引不能创建本地分区索引。 ------------------------------------------------------------------------------- create table test_partiton_02( number_1 number, number_2 number, string_1 varchar2(10), string_2 varchar2(20) ) partition by range(number_2) ( partition p1 values less than (10000), partition p2 values less than (20000), partition p3 values less than (50000), partition p4 values less than (70000), partition p5 values less than (maxvalue) );
--试图创建本地分区索引
CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) local (PARTITION p1, PARTITION p2, PARTITION p3);--ora-14024 索引的分区数必须等于基础表的分区数 --创建本地分区索引 CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) local (PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4, PARTITION p5 );--drop index ix_test_partiton_02_1; CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) local; --和上面的创建方式等效 --drop index ix_test_partiton_02_1; CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) ; --默认创建的是 非分区索引,分区索引才分 全局索引还是本地索引 ; ---创建全局分区索引 CREATE INDEX ix_test_partiton_02_2 ON test_partiton_02(number_2) GLOBAL PARTITION BY RANGE (number_2) (PARTITION p1 VALUES LESS THAN (10000), PARTITION p2 VALUES LESS THAN (55000), PARTITION p3 VALUES LESS THAN (MAXVALUE)); ---写入测试数据 insert into test_partiton_02(number_1, number_2, string_1, string_2) select dbms_random.random() as number_1, round(dbms_random.value(0, 100000)) as number_2, dbms_random.string(opt => A, len => 1) as String_1, dbms_random.string(opt => p, len => 10) as String_2 from dual connect by rownum < 100001; commit; --分析表 analyze table test_partiton_02 compute statistics; --查看 普通索引是否可用 select * from user_indexes t where t.INDEX_NAME in(IX_TEST_PARTITON_02_1,IX_TEST_PARTITON_02_2,IX_TEST_PARTITON_02_3); ---查看分区索引是否 可用 select * from user_ind_partitions t where t.INDEX_NAME in(IX_TEST_PARTITON_02_1,IX_TEST_PARTITON_02_2,IX_TEST_PARTITON_02_3); ---改变分区,查看普通索引和分区索引是否可用 -- 必须调整最后一个分区的大小,所以如果最后一个分区指定了最大值 必须先删除,再添加 alter table test_partiton_02 add partition p6 values less than (90000); alter table test_partiton_02 drop partition p5; --- 结论 改变分区 普通索引和全局分区索引都会失效 只有本地分区索引好使
PS:最好用以下语句查看索引的定义语句 select dbms_metadata.get_ddl(object_type => INDEX, name => IX_TEST_PARTITON_02_1) FROM DUAL; select dbms_metadata.get_ddl(object_type => INDEX, name => IX_TEST_PARTITON_02_2) FROM DUAL;
--- 发现了 plsql developer Version 11.0.5.1790 (64 bit) 的一个 bug 在用View 查看 DDL时 没有反应真实的情况

 

以上是关于oracle 有全局索引怎么删除分区的主要内容,如果未能解决你的问题,请参考以下文章

oracle里,truncate一个分区,能不能保留全局索引

oracle 全局索引和局部索引的区别和作用

同一个列,可以同时有分区索引和全局索引吗

如何让Oracle表的索引暂时失效?然后恢复有效

Oracle非分区索引,全局分区索引和本地分区索引。

oracle表分区和索引分区