1. 程式人生 > >Range分割槽

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的必須和其基本分割槽數一致。