非分割槽錶轉換為分割槽表和partition index

tolilong發表於2012-07-04

非分割槽錶轉換為分割槽表

1).檢測是否可以轉換

SQL> exec dbms_redefinition.can_redef_table('scott','test')

已順利完成 PL/SQL 程式.

2).建立臨時表並化分割槽

create table test_temp

(owner varchar2(30) not null,

object_name varchar2(30) not null,

object_id number not null,

object_type varchar2(30)

)

partition by range(object_id)

(partition p1 values less than (400) tablespace users,

partition p2 values less than (950) tablespace test,

partition p3 values less than (maxvalue) tablespace users

)

3).開始重定義表

SQL> exec dbms_redefinition.start_redef_table('scott','test','test_temp')

已順利完成 PL/SQL 程式.

4).建立索引限制及觸發器

SQL> var v_num number

SQL> exec dbms_redefinition.copy_table_dependents('scott','test','test_temp',dbms_redefinition.cons_orig_params,true,true,true,true,:v_num,true);

已順利完成 PL/SQL 程式.

http://yangtingkun.itpub.net/post/468/494878 (其中遇見問題參考)

5).同步表內容

如果同步的資料很大,則可以考慮透過prebuilt table的方法建立物化檢視

Exec dbms_redefinition.sync_interim_table(‘scott’,’test’,’test_temp’)

6).結束轉換過程

SQL> exec dbms_redefinition.finish_redef_table('scott','test','test_temp')

已順利完成 PL/SQL 程式.

7).刪除臨時表test_temp

Drop table test_temp

其中可以使用dbms_redefinition.abort_redef_table(‘scott’,’test’,’test_temp’)中途退出該過程。

Index

Local index:

l 本地索引一定是分割槽索引,分割槽鍵等同於表的分割槽鍵,分割槽數等同於表的分割槽數目,本地索引的分割槽機制和表的分割槽機制一樣。

l 如果本地索引的的索引列伊分割槽鍵開頭,則稱之為字首索引

l 如果本地索引的索引列不是以分割槽鍵開頭,不包含分割槽鍵之,稱之為非字首索引

l 點陣圖索引只能為本地分割槽索引

l 本地所有多應用於資料倉儲環境中olap

l 本地所有隻支援分割槽內的唯一性,無法支援表上的唯一性,如果要使用本地索引給表做唯一性約束,則約束中必須要包括分割槽鍵列。

create index test_index on test(object_id)

local

(

partition p1 tablespace users,

partition p2 tablespace test,

partition p3 tablespace tbs

)

alter table test add primary key(object_Id) using index test_index

或者:

create index test_index1 on test(object_id) local

select dbms_metadata.get_ddl('INDEX','TEST_INDEX1','SCOTT') from dual

create index test_index2 on test(object_type) local

非字首索引,索引中不包含分割槽鍵

select dbms_metadata.get_ddl('INDEX','TEST_INDEX2','SCOTT') from dual

SQL> select index_name,table_name,partitioning_type,locality,alignment from user_part_indexes where table_name='TEST';

INDEX_NAME TABLE_NAME PARTITIONING_T LOCALITY ALIGNMENT

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

TEST_INDEX1 TEST RANGE LOCAL PREFIXED

TEST_INDEX2 TEST RANGE LOCAL NON_PREFIXED

Global index:

l 全域性索引的分割槽鍵和分割槽數和表的分割槽鍵和分割槽數可能都不相同,表和全域性索引的分割槽機制不一樣。

l 全域性索引可以分割槽,也可以不分割槽索引。全域性索引必須是字首索引,即全域性索引的索引列必須是一索引分割槽鍵作為前幾列。

l 全域性分割槽索引的索引條目可能指向若干個分割槽,因此,對於全域性分割槽索引,即使只截斷一個分割槽中的資料,都需要rebuild若干個分割槽甚至是整個索引。

l 全域性索引多用於oltp系統中。

l 全域性分割槽索引只按範圍或者雜湊hash分割槽,hash分割槽是10g以後才支援。

l 9i後對分割槽表組move或者truncate時可以用update global indexes語句來同步更新全域性分割槽索引,用消耗一定資源來換可用性。

l 全域性分割槽索引只能是B樹索引,而且只能是字首索引。

Eg:

create table test1

(id int,

name varchar2(20),

desc1 varchar2(20)

)

partition by range(id)

(

partition p1 values less than (1000) tablespace users,

partition p2 values less than (5000) tablespace test,

partition p3 values less than (maxvalue) tablespace tbs

)

建立索引:

create index test1_global_index on test1(id) global

partition by range(id)

(partition p1 values less than (4000) tablespace users,

partition p2 values less than (maxvalue) tablespace test

)

SQL> alter table test1 drop partition p3;

已更改表格.

索引的狀態發生變化

SQL> select index_name,partition_name,status from user_ind_partitions where index_name='TEST1_GLOBAL_INDEX';

INDEX_NAME PARTITION_ STATUS

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

TEST1_GLOBAL_INDEX P1 UNUSABLE

TEST1_GLOBAL_INDEX P2 UNUSABLE

必須加上前置碼

SQL> l

1 create index test1_global_index1 on test1(object_type) global

2 partition by range(id)

3 (partition p1 values less than (4000),

4 paritition p2 less than (maxvalues)

5* )

SQL> /

partition by range(id)

*

ERROR 在行 2:

ORA-14038: GLOBAL 分割索引必須加上前置碼

不能和點陣圖索引使用

SQL> l

1 create bitmap index test1_global_index1 on test1(object_type) global

2 partition by range(id)

3 (partition p1 values less than (4000),

4 paritition p2 less than (maxvalues)

5* )

SQL> /

create bitmap index test1_global_index1 on test1(object_type) global

*

ERROR 在行 1:

ORA-25113: GLOBAL 可能無法與點陣圖索引一起使用

操作索引部分

 

索引型別

range

hash/list

組合

刪除索引分割槽

global

drop partition

local

 

 

 

重建索引分割槽

global

rebuild partition

local

rebuild partition

rebuild partition

rebuild subpartition

重新命名索引分割槽

global

rename partition

local

rename partition

ename partition

rename subpartition

分割索引分割槽

global

split partition

local

 

 

 

SQL> alter index test1_global_index drop partition p1;

已更改索引.

SQL> alter index test1_global_index rebuild partition p2;

已更改索引.

SQL> alter index test1_global_index rename partition p2 to p1;

已更改索引.

user_part_tables 分割槽表資訊

user_tab_partitions 分割槽分層資訊

user_tab_subpartitions 子分割槽分層資訊

user_part_key_columns 分割槽表的分割槽鍵列

user_subpart_key_columns 組合分割槽表的子分割槽鍵列

表的分割槽的列統計資訊和直方圖

user_part_col_statistics

user_part_histograms 表的分割槽上的直方圖的直方圖的直方圖資料

user_subpart_histograms

user_part_indexes 分割槽索引的分割槽資訊

user_ind_partitions 分割槽層次的分割槽資訊,分割槽的儲存引數

user_ind_subpartitions

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24237320/viewspace-1058717/,如需轉載,請註明出處,否則將追究法律責任。

相關文章