Range分区

入门例子:
–建立表
CREATE TABLE sale(
product_id VARCHAR2(5),
sale_count NUMBER(10,2)
)
–分区
PARTITION BY RANGE (sale_count)
(
PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (3000)

);

DROP TABLE sale;
–查看所有分区
SELECT * FROM user_tab_partitions ORDER BY partition_name ASC ;
----分区数据查看
SELECT * FROM SALE PARTITION (p1) FOR UPDATE ;
SELECT * FROM SALE PARTITION (p2) FOR UPDATE ;
SELECT * FROM SALE PARTITION (p3) FOR UPDATE ;
SELECT * FROM SALE PARTITION (p4) FOR UPDATE ;

----分区拓展
—全表添加分区
ALTER TABLE SALE ADD PARTITION p4 VALUES LESS THAN (MAXVALUE );
----拆分已建立的分区,并与其它分区合并
ALTER TABLE SALE SPLIT PARTITION p3 AT (3000) INTO (PARTITION p3,PARTITION p4);
ALTER TABLE SALE DROP PARTITION p4 ; ----删除分区:相应的在此区间内的数据也会丢失
----将分区1中的数据改为数值范围在分区2中的数据的时候,需要先enable row movement
ALTER TABLE SALE ENABLE ROW MOVEMENT ;
UPDATE SALE SET sale_count = 1322 WHERE product_id = ‘1’;
----删除分区索引LOCAL
drop index id_local;

INSERT INTO SALE VALUES (‘1’,‘12’);
INSERT INTO SALE VALUES (‘2’,‘1321’);
INSERT INTO SALE VALUES (‘3’,‘2001’);
INSERT INTO SALE VALUES (‘4’,‘4301’);

分区索引:
一般建议建立LOCAL的索引,因为GLOBAL的容易所有的都失效,而LOCAL的最多只在某个分区上失效。索引失效必须一个分区的一个分区的REBUILD

–在sale_count列上创建一个LOCAL的索引
create index id_sale_count on sale(sale_count) local;
–查看LOCAL索引 index_name =‘内容必须大写,否则查不出内容’ ----必须具有dba权限才可以查询哦
select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name=‘ID_SALE_COUNT’;
----删除分区索引LOCAL
DROP INDEX id_sale_count;

GLOBAL索引

–创建全局索引
create index id_sale_count_global on SALE(sale_count) global
partition by range(sale_count)
( partition p1 values less than (10000) ,
partition p2 values less than (MAXVALUE)
);

–查看全局索引
–dba_ind_partitions查看方式
select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions
where index_name=‘ID_SALE_COUNT_GLOBAL’;
–dba_indexes查看方式
select INDEX_NAME,INDEX_TYPE,TABLE_NAME from dba_indexes where
index_name=‘ID_SALE_COUNT_GLOBAL’;

–到底如何判断建立怎样的分区索引(GLOBAL 还是LOCAL)
–第一种情况:
– 如果查询的语句的条件是where createdate=‘2012-10-19’ and id>100,则此时查询的是4号分区,
– 假设他有10万条记录。在扫描这10万条记录的时候,
– 可以使用id列上的索引。这个时候可以在ID列上建立个local nonprofiex索引
create index index_tt1_local on TT(id) local
( partition p1,
partition p2,
partition p3,
partition p4,
partition p5
);
–查看索引
select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name=‘INDEX_TT1_LOCAL’;

–删除索引
DROP INDEX index_tt1_local;

– 第二种情况:
– 如果查询的语句条件只有一个createdate,如where createdate=‘2010-10-19’,
– 则这种情况就在createdate上建立一个local profiex索引
create index index_TT2_local on TT(createdate) local;
–查看索引
select INDEX_NAME,PARTITION_NAME,HIGH_VALUE,STATUS from dba_ind_partitions where index_name=‘INDEX_TT2_LOCAL’;

–删除索引
DROP INDEX index_TT2_local;
从上面查询可以看出他和表是equi-partitioned.

– 第三种情况:
– 如果查询根本就没有createdate,而是有像where id>100的条件,
– 则就只能在ID列上建立GLOBAL索引了
create index index_tt3_global on TT(id)
global partition by range(id)
(
partition p1 values less than (100000),
partition p2 values less than (200000),
partition p3 values less than (MAXVALUE)
);
– 从上面可以看出,GLOBAL的索引的分区数和其基本是没有关系的。
– 他甚至可以想下面一个建立索引,即一个普通索引。
– 但是LOCAL的必须和其基本分区数一致。

猜你喜欢

转载自blog.csdn.net/qq_34749144/article/details/84107551